Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在Sinatra中为多个请求维护Oauth2会话的有效性?_Ruby_Session_Request_Sinatra_Oauth 2.0 - Fatal编程技术网

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

Ruby 如何在Sinatra中为多个请求维护Oauth2会话的有效性?,ruby,session,request,sinatra,oauth-2.0,Ruby,Session,Request,Sinatra,Oauth 2.0,我正在开发一个Sinatra web应用程序,我计划在其中添加谷歌登录功能 虽然我能够理解Google的Oauth2身份验证机制,而且一切似乎都很好,但我有一个关于维护会话的基本问题。 我正在使用Oauth2的服务器端web应用程序流 在我提问之前,这里是我对Oauth2身份验证机制的理解 一旦用户单击“使用谷歌登录”按钮,事件顺序如下: 用户被重定向到Google oauth授权服务器 Google oauth2授权服务器检查用户是否有活动的 会议 如果是,它会提示用户授予对我的应用程序的访

我正在开发一个Sinatra web应用程序,我计划在其中添加谷歌登录功能

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

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

一旦用户单击“使用谷歌登录”按钮,事件顺序如下:

  • 用户被重定向到Google oauth授权服务器
  • Google oauth2授权服务器检查用户是否有活动的 会议
  • 如果是,它会提示用户授予对我的应用程序的访问权,以获取从Google请求的数据
  • 如果用户授予访问权,则发送回身份验证代码并获取访问令牌的过程开始
根据我在网上遇到的情况,上面所有代码都必须放在before过滤器中

我的问题如下:

  • 如果我将此代码添加到before过滤器中,那么对于来自用户的每个应用程序请求,都会有一个到Google身份验证服务器的往返过程
  • 我在上面的陈述1中的想法正确吗
  • 这有必要吗
  • 对于我的服务器的每个请求,是否有其他方法可以在不接触Google服务器的情况下验证会话
  • 这不会造成开销吗
  • 使用oauth2的web应用通常如何处理跨多个请求的会话有效性检查

  • 对于这个冗长的问题,非常抱歉,谢谢您的耐心。

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

    让我知道它是否有效。

    当用户单击登录链接并返回有效响应时,即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中不可用。但我理解您的意思是,我在会话散列中存储了来自用户配置文件的一些独特信息,然后在执行之前在
    中检查这些信息。我的问题是,即使用户已从浏览器的另一个选项卡从google(提供商)注销,这是否仍然允许用户绕过
    /login
    ?接受@Noop的回答,因为这为我指明了正确的方向。谢谢你的回答。我没有使用Omniauth,只是使用Oauth2 gem。因此,omniauth.auth哈希在request.env中不可用。但我理解您的意思是,我在会话散列中存储了来自用户配置文件的一些独特信息,然后在执行之前在
    中检查这些信息。我的问题是,即使用户已从浏览器的另一个选项卡从google(提供商)注销,这是否仍然允许用户绕过
    /login
    ?接受@Noop的回答,因为这为我指明了正确的方向。