【问题标题】:Doorkeeper Revoke Token门卫撤销令牌
【发布时间】:2013-11-21 15:03:37
【问题描述】:

我正在我的应用程序中实现 OAuth 2,并且我已经拥有登录/刷新令牌,但我在注销时遇到了一些问题。

我有这组由 Doorkeeper 生成的路由:

Routes for Doorkeeper::Engine:
          authorization GET    /authorize(.:format)                   doorkeeper/authorizations#new
          authorization POST   /authorize(.:format)                   doorkeeper/authorizations#create
          authorization DELETE /authorize(.:format)                   doorkeeper/authorizations#destroy
                  token POST   /token(.:format)                       doorkeeper/tokens#create
           applications GET    /applications(.:format)                doorkeeper/applications#index
                        POST   /applications(.:format)                doorkeeper/applications#create
        new_application GET    /applications/new(.:format)            doorkeeper/applications#new
       edit_application GET    /applications/:id/edit(.:format)       doorkeeper/applications#edit
            application GET    /applications/:id(.:format)            doorkeeper/applications#show
                        PUT    /applications/:id(.:format)            doorkeeper/applications#update
                        DELETE /applications/:id(.:format)            doorkeeper/applications#destroy
authorized_applications GET    /authorized_applications(.:format)     doorkeeper/authorized_applications#index
 authorized_application DELETE /authorized_applications/:id(.:format) doorkeeper/authorized_applications#destroy

我想做的是撤销服务器中的令牌,所以我认为我必须调用的服务是“删除/授权”对吗?但我尝试了很多不同的方式来使用这些服务,但我只发现错误。

顺便说一句,我不知道撤销服务器中的令牌或仅从应用程序中删除它是否正确?

PS:我在 iOS 7 中为我的客户端使用 AFNetworking 2。

【问题讨论】:

  • 对这个问题投了赞成票。我的客户会忘记令牌并刷新令牌没问题。只有服务器仍然有一个经过身份验证的用户。当客户端再次进行身份验证时,它会获取该用户。很可能这是我在服务器端做错的事情。尽管如此,似乎应该通知服务器不应再兑现令牌。

标签: ruby-on-rails oauth-2.0 doorkeeper


【解决方案1】:

这并没有真正回答问题,但提供了相关信息。

我遇到的问题是,在对有效的用户/密码组合进行任何事先授权后,门卫会验证资源所有者密码凭据授予请求中的任何用户/密码组合。情景是:

  • 客户端使用有效的用户名和密码获得授权
  • 客户端重置/忘记授权令牌以结束授权
  • 客户端可以使用任意用户名和密码获取新的授权,为原用户授权。

原来是 Warden 将授权用户保持在会话中,而我的 iOS 客户端很乐意为我维护会话。

我通过让管理员在验证后立即注销用户来解决此问题。这是有效的,因为在授权请求中,OAuth 会使用授权令牌存储当前用户。它不需要让用户参与会话。

以下内容来自 config/initializers/doorkeeper.rb。最后两行在授权后进行注销。

# called for Resource Owner Password Credentials Grant
  resource_owner_from_credentials do
  request.params[:user] = {:email => request.params[:username], :password => request.params[:password]}
  request.env["devise.allow_params_authentication"] = true
  user = request.env["warden"].authenticate!(:scope => :user)
  env['warden'].logout
  user
end 

【讨论】:

  • 我很确定这可以通过指示 Warden 将经过身份验证的用户存储在会话中来解决。 user = request.env["warden"].authenticate!(scope: :user, store: false) 见:github.com/doorkeeper-gem/doorkeeper/issues/…
  • 由于这会在登录过程中注销用户,因此无法刷新令牌(隐式授予,您没有获得刷新令牌)并且用户必须在之后再次登录几个小时(令牌到期时)。当用户按下“注销”时,我想注销该用户。通常的会话#destroy 不起作用!即使是做warden.logout的事后电话也不起作用!这种情况应该怎么办?
  • @SagarRanglani 谢谢你的提问。我不再使用这个软件,也不再参与任何使用 OAuth 的应用程序。从表面上看,我的回答是您在评论中提到了一个单独的、不相关的问题。令牌更新是使用 OAuth 的另一个方面。我不能说这个 SO 问题和答案与当前提供的 OAuth 解决方案的相关性。
【解决方案2】:

如果我理解正确,问题是 1)用户进入客户端应用程序,点击登录 2) 客户端应用程序从 oauth-server 获得身份验证。此时要求用户输入用户名/密码 3) 用户在客户端应用程序中单击注销 4)用户在客户端应用程序中再次单击登录,它会自动使用旧的经过身份验证的令牌让他登录,而不是再次询问用户名和密码,这就是你想要的。

如果这是您的问题,则与 cookie 有关。检查每个请求中发送的 cookie。就我而言,我必须添加一行

cookies.delete '_oauth_server_name_session'

然后它起作用了。您可以先确认这是 cookie 问题,因为如果您切换浏览器(或进入隐身模式),这不会发生。

【讨论】:

    猜你喜欢
    • 2022-10-22
    • 2012-07-19
    • 2019-04-12
    • 1970-01-01
    • 2014-06-06
    • 2021-09-24
    • 1970-01-01
    • 2015-11-02
    • 2020-09-29
    相关资源
    最近更新 更多