Laravel Passport: как создать access_token + refresh_token + scopes

Как получить refresh_token средствами Laravel Passport?

Вот что хочу: на роут отправляется запрос пользователь + пароль:

  • user: user
  • password: pa$$word

на выходе получаем:

  • access_token вместе со scopes
  • refresh_token

Пользователю не дается право выбирать scopes, он просто авторизуется, и scopes выбираются согласно бизнес-логики $scopes = $user->scopes();. Если упростить, то пользователь авторизовался => ему выдали токен с правами только просмотра новостей scopes: view-news, но не редактирования scopes: edit-news.

Вот мой текущий код:

public function getToken(Request $request)
{
  // пользователь авторизован посредством middleware
  $user = Auth::user();

  $email = $user->email;

  // моя реализация получения области видимости для пользователя
  $scopes = $user->scopes();

  // это из Passport трейта "HasApiTokens"
  $token = $user->createToken(sprintf("%s-%s", $email, now()), $scopes);

  return response()->json([
      "access_token" => $token->accessToken,
// как создать рефреш токен?      
//      "refresh_token" => ...,
      "expires_at" => Carbon::parse(
          $token->token->expires_at
      )->toDateTimeString()
  ])->setStatusCode(201);
}

User::createToken() создает только access_token, а мне нужен также и refresh_token.

В интернете написано, что в контроллере отправлять запросы на oauth/token, но тогда не понятно какие scopes будут подключены к пользователю, и как ими управлять.

Другими словами:

  • oauth/token - не понятно как запрограммировать логику привязки scopes к пользователю
  • $user->createToken() - не создается refresh_token

Как мне поступить?

PS. Если в своем контроллере делать HTTP-запрос на oauth/token (через Guzzle) - это не желательно, так как не будут работать автотесты, которые используют in-memory database.


Ответы (0 шт):