【问题标题】:How to maintain Oauth2 session validity in Sinatra for multiple requests?如何在 Sinatra 中为多个请求维护 Oauth2 会话有效性?
【发布时间】:2013-05-24 06:48:39
【问题描述】:

我正在开发一个 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 的网络应用程序通常如何处理跨多个请求的会话有效性检查?

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

【问题讨论】:

    标签: ruby session request sinatra oauth-2.0


    【解决方案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
    

    让我知道它是否有效。

    【讨论】:

    • 感谢您的回答。我没有使用 Omniauth,只是使用了 Oauth2 gem。所以omniauth.auth 哈希在request.env 中不可用。但我知道您是说我将用户个人资料中的一些独特信息存储在会话哈希中,然后在before do 中检查。我的问题是,即使用户已经从浏览器中的另一个选项卡从 google(提供者)注销,这是否仍然允许用户绕过 /login
    • 接受@Noop 的回答,因为这为我指明了正确的方向。
    猜你喜欢
    • 2013-12-17
    • 2013-11-25
    • 1970-01-01
    • 2011-11-05
    • 2011-07-21
    • 2013-08-03
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多