Швейцар отозвать жетон

Я реализую 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: я использую AFNetworking 2 в iOS 7 для моего клиента.

2 ответа

Это на самом деле не отвечает на вопрос, но предоставляет соответствующую информацию.

У меня возникла проблема, когда администратор дверей проверял любую комбинацию пользователя и пароля в запросе на предоставление пароля для владельца ресурса после того, как сделал какое-либо предварительное разрешение на действительную комбинацию пользователя и пароля. Сценарий был:

  • клиент получает авторизацию, используя действительное имя пользователя и пароль
  • клиент сбрасывает / забывает токен авторизации для завершения авторизации
  • Клиент может получить новую авторизацию, используя любое имя пользователя и пароль, авторизирующийся для исходного пользователя.

Оказалось, что Warden держит авторизованного пользователя в сеансе, а мой iOS-клиент радостно поддерживает сеанс для меня.

Я решил это, заставив начальника немедленно выйти из системы после аутентификации. Это работает, потому что по авторизованному запросу OAuth получает текущего пользователя, сохраненного с токеном авторизации. Для этого не нужно иметь пользователя в сеансе.

Следующее от config/initializer /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) пользователь заходит в клиентское приложение, нажимает кнопку входа, 2) клиентские приложения получают аутентификацию с oauth-сервера. в данный момент у пользователя запрашивается имя пользователя / пароль 3) пользователь нажимает кнопку выхода из системы в клиентском приложении 4) пользователь снова нажимает кнопку входа в систему в клиентском приложении, и он автоматически регистрирует его, используя старый аутентифицированный токен, а не запрашивает имя пользователя и снова pw, что то, что ты хочешь.

Если это ваша проблема, это связано с куки. Проверьте куки, отправляемые в каждом запросе. В моем случае мне пришлось добавить строку

cookies.delete '_oauth_server_name_session'

и это сработало тогда. Вы можете сначала подтвердить, что это проблема с файлами cookie, потому что если вы переключите браузер (или перейдете в режим инкогнито), этого не произойдет.

Другие вопросы по тегам