Создание нового пользователя с учетными данными, а затем получение токена для этого пользователя с 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