我正在我的应用程序中实现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


我想做的是撤销服务器中的令牌,所以我认为我必须调用的服务是“ DELETE / authorize”,对吗?但是我尝试了许多使用此服务的不同方式,并且我只记录错误。

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

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

最佳答案

这并不能真正回答问题,但是可以提供相关信息。

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


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


事实证明,这是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

09-25 16:05