1

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

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

在我在这里问我的问题之前,是我对 Oauth2 身份验证机制的理解。

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

  • 用户被重定向到 Google oauth 授权服务器。
  • Google oauth2 授权服务器检查用户是否有活动会话。
  • 如果是,它会提示用户授予对我的应用程序的访问权限,以获取来自 Google 的请求数据。
  • 如果用户授予访问权限,则发送回 auth_code 和获取访问令牌的过程开始。

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

我的问题如下:

  1. 如果我将此代码添加到之前的过滤器中,那么对于来自用户的应用程序的每个请求,都会往返于 Google 身份验证服务器。
  2. 我在上面的陈述 1 中的想法正确吗?
  3. 这是必要的吗?
  4. 对于对我的服务器的每个请求,是否有其他方法可以验证会话而无需访问 Google 服务器?
  5. 这不会造成开销吗?
  6. 使用 oauth2 的网络应用程序通常如何处理跨多个请求的会话有效性检查?

很抱歉这个冗长的问题,感谢您的耐心等待。

4

1 回答 1

1

当用户单击登录链接并返回有效响应即 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

让我知道它是否有效。

于 2013-05-31T11:18:29.667 回答