如何在Sinatra中为多个请求维护Oauth2会话的有效性?

时间:2013-05-29 06:05:16

标签: ruby session request sinatra oauth-2.0

我正在开发一个Sinatra网络应用程序,我计划在其中添加Google登录功能。

虽然我能够理解Google的Oauth2身份验证机制,但一切似乎都运行良好,但我有一个关于维护会话的基本问题。 我正在使用Oauth2的服务器端Web应用程序流。

在此之前我问我的问题是我对Oauth2认证机制的理解。

用户点击“使用Google登录”按钮后,事件顺序为:

  • 用户被重定向到Google oauth授权服务器。
  • Google oauth2授权服务器会检查用户是否处于活动状态 会话。
  • 如果是,则会提示用户授予我的应用程序访问Google所请求数据的权限。
  • 如果用户授予访问权限,则会开始发回auth_code并获取访问权限的过程。

根据我在网络上遇到的情况,上述所有内容的代码都必须放在之前的过滤器中。

我的问题如下:

  1. 如果我将此代码添加到之前的过滤器中,那么对于从用户来到我的应用程序的每个请求,都会向Google身份验证服务器进行往返。
  2. 我在上面的声明1中是否正确?
  3. 这有必要吗?
  4. 是否有其他方法可以验证会话,而不会在每次向我的服务器发出请求时与Google服务器联系?
  5. 这不会导致开销吗?
  6. 使用oauth2的网络应用如何处理多个请求之间的会话有效性?
  7. 对于这个冗长的问题感到抱歉,感谢您的耐心等待。

1 个答案:

答案 0 :(得分:1)

当用户点击Login链接并返回有效响应时,即request.env [“omniauth.auth”],您需要在会话中存储“uid”,然后在下一个请求中检查会话。喜欢这个

before do
  unless ['/login', '/auth/google_oauth2/callback'].include?(action)
    unless session[:uid]
      redirect "/login"
    end
  end
end

get "/auth/google_oauth2/callback" do
  session[:uid] = request.env["omniauth.auth"]["uid"]
  redirect "/"
end

让我知道它是否有效。