Подтвердить что ты не робот

Как я могу предварительно авторизовать клиентское приложение для своего пользователя на моем oauth-провайдере, который использует привратник?

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

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

Я попытался подражать коду я найденному здесь, с чем-то вроде:

Doorkeeper::Application.all.each do |application|
  auth_params = {response_type: 'code', client_id: application.uid, redirect_uri: application.redirect_uri}
  client = Doorkeeper::OAuth::Client.find(application.uid)
  authorization = Doorkeeper::OAuth::AuthorizationRequest.new(client, user, auth_params)
  authorization.authorize
end

но это не сработало, оно все равно дает пользователю приглашение Authorize/Deny для клиентского приложения. Предложения?

4b9b3361

Ответ 1

OAuth предоставляет ресурс Credentials Credentials для этого, который поддерживает Doorkeeper. В основном вы запрашиваете токен доступа с учетными данными пользователя (имя пользователя и пароль). Таким образом вы пропустите подтверждение пользователя, и вам также не нужен URL-адрес обратного вызова.

Чтобы настроить Doorkeeper:

Doorkeeper.configure do
  resource_owner_from_credentials do |routes|
    User.authenticate!(params[:username], params[:password]) # change this if needed
  end
end

Пример запроса токена:

curl -i https://example.com/oauth/token \
     -F grant_type=password \
     -F client_id=<client_id> \
     -F client_secret=<client_secret> \
     -F [email protected] \
     -F password=password

Если ваши клиентские приложения OAuth являются приложениями Rails, вы можете использовать oauth2 для этого:

client = OAuth2::Client.new('client_id', 'client_secret', :site => "https://example.com")
access_token = client.password.get_token('[email protected]', 'password')

Также см. Doorkeepers wiki:

https://github.com/applicake/doorkeeper/wiki/Using-Resource-Owner-Password-Credentials-flow

Ответ 2

Doorkeeper 0.6.7 предоставляет опцию configure для этого.

Чтобы настроить Doorkeeper:

Doorkeeper.configure do
  skip_authorization do
    true
  end  
end

Ответ 3

Ваше приложение может предварительно авторизовать все клиентские приложения, добавив

skip_authorization do
  true
 end

для инициализатора приставки или для каждого приложения, добавив логическую строку preauthorized в таблицу Doorkeeper oauth_applications. Затем добавьте что-то вроде этого в инициализатор:

skip_authorization do |resource_owner, client|
  client.application.preauthorized?
 end

Ответ 4

Вы можете получить токен для своего приложения, чтобы обойти этот экран подтверждения в сообщении /oauth/token. Подстройте его по своему вкусу.

В вашем клиентском приложении:

require 'rest-client'
require 'json'

client_id = '4ea1b...'
client_secret = 'a2982...'

response = RestClient.post 'http://localhost:3000/oauth/token', {
  grant_type: 'client_credentials',
  client_id: client_id,
  client_secret: client_secret
}
token = JSON.parse(response)["access_token"]

Теперь вы можете запросить доступ к защищенным ресурсам, для которых не требуется владелец ресурса:

RestClient.get 'http://localhost:3000/api/v1/profiles.json', { 'Authorization' => "Bearer #{token}" }

Источник: https://github.com/applicake/doorkeeper/wiki/Client-Credentials-flow