Швейцар отозвать жетон
Я реализую 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, потому что если вы переключите браузер (или перейдете в режим инкогнито), этого не произойдет.