Ruby 如何在Sinatra中为多个请求维护Oauth2会话的有效性?
我正在开发一个Sinatra web应用程序,我计划在其中添加谷歌登录功能 虽然我能够理解Google的Oauth2身份验证机制,而且一切似乎都很好,但我有一个关于维护会话的基本问题。 我正在使用Oauth2的服务器端web应用程序流 在我提问之前,这里是我对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授权服务器检查用户是否有活动的 会议 如果是,它会提示用户授予对我的应用程序的访
- 用户被重定向到Google oauth授权服务器
- Google oauth2授权服务器检查用户是否有活动的 会议
- 如果是,它会提示用户授予对我的应用程序的访问权,以获取从Google请求的数据
- 如果用户授予访问权,则发送回身份验证代码并获取访问令牌的过程开始
对于这个冗长的问题,非常抱歉,谢谢您的耐心。当用户单击登录链接并返回一个有效的响应,即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的回答,因为这为我指明了正确的方向。