Создание нового пользователя с учетными данными, а затем получение токена для этого пользователя с Doorkeeper в API
Я создаю API, защищенный Doorkeeper.
Если я вручную создаю пользователя (с паролем) в бэкэнд, а затем отправлю следующее в oauth/token
, Doorkeeper успешно генерирует токен доступа для пользователя и возвращает его:
data = {
username: $("#email_sign_in").val(),
password: $("#password").val(),
grant_type: 'password',
client_id: '880c16e50aee5893446541a8a0b3788....',
client_secret: 'a5108e1a1aeb87d0bb49d33d8c50d....',
provider: 'identity'
}
Тем не менее, я пытаюсь понять, как я могу сделать поток регистрации.
Я счастливо получил users/create
, работая, поскольку он создает пользователя и пароль, но я не уверен, как затем сгенерировать Doorkeeper:: AccessToken на следующем шаге и вернуть его клиенту, В идеале, после создания пользователя в действии # # пользователя, я затем перенаправляю POST на oauth/token
с именем пользователя и паролем, но я знаю, что вы не можете перенаправлять на POST.
У меня есть копание в источнике Doorkeeper, но я немного теряюсь во всем этом умном промежуточном программном обеспечении. Любые советы по этому поводу приветствуются!
Ответы
Ответ 1
Это было самое простое! Я был слишком расстроен, пытаясь выполнить POST, когда на самом деле я мог просто создать DoorKeeper:: AccessToken в user # create, а затем вернуть это.
Здесь код для генерации токена:
access_token = Doorkeeper::AccessToken.create!(:application_id => application_id, :resource_owner_id => user_id)
Ответ 2
Я копаю немного в исходном коде для привратника, как способ создания токена с использованием стандартного метода api, вам лучше использовать следующий метод, если вы вручную это сделаете.
find_or_create_for(application, resource_owner_id, scopes, expires_in, use_refresh_token)
для вашего случая
access_token = Doorkeeper::AccessToken.find_or_create_for(application: application, resource_owner_id: user_id)
ссылка на исходный код привратника
find_or_create_for в привратнике
Ответ 3
В рельсах мы можем создать токен доступа с помощью DoorKeeper, используя:
Doorkeeper::AccessToken.create!(
application_id: nil,
resource_owner_id: user.id,
expires_in: 2.hours,
scopes: 'public'
)
Ответ 4
В идеале лучший ответ - не тот, который вы опубликовали, я думаю, что лучше создать контроллер, который наследуется от Doorkeeper::TokensController
:
# app/controllers/custom_tokens_controller.rb
class CustomTokensController < Doorkeeper::TokensController
# Override create action
def create
(... your custom code ...)
super
end
end
Затем в routes.rb
определите новый маршрут, например post 'custom_tokens', to: 'custom_tokens#create'
или любое post 'custom_tokens', to: 'custom_tokens#create'
имя, которое вы предпочитаете, но нужно create
.
Подробнее об этом решении можно узнать здесь: https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Resource-Owner-Password-Credentials-flow