门卫撤销令牌

时间:2013-11-21 15:03:38

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

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

我有门卫生成的这组路线:

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作为我的客户端。

2 个答案:

答案 0 :(得分:4)

这并没有真正回答这个问题,而是提供相关信息。

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

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

结果是Warden将授权用户保留在会话中,我的iOS客户端愉快地为我维护会话。

我通过让warden在验证后立即注销用户来解决这个问题。这是有效的,因为在授权请求中,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 

答案 1 :(得分:0)

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

如果这是您的问题,那就与Cookie有关。检查每个请求中发送的cookie。在我的情况下,我不得不添加一行

cookies.delete '_oauth_server_name_session'

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

相关问题