0
0

More than 1 year has passed since last update.

ユーザー認証しないLaravel Sanctum

Last updated at Posted at 2022-12-07

そんなケースあまり無いと思いますが、SanctumでトークンベースのAPI作りたいけど、ユーザーのログインは必要ないときのメモです。

準備

導入

まずは以下に則って導入します。

実装

モデル作成

まずは、Sanctumを導入したときに追加されるテーブルのモデルを作ります。

PersonalAccessToken.php
use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;

class PersonalAccessToken extends SanctumPersonalAccessToken
{
    use HasApiTokens;
    /** 省略 **/
}

通常HasApiTokensはUserモデル等でuseしますが、今回はユーザー認証が必要ないので、自分自身に紐づくようにPersonalAccessTokenでuseします。

認証処理

ユーザー認証しないとはいえ認証の処理は必要なので記載します。

PersonalAccessToken.php
/**
 * アクセストークンの有効性を独自チェックする
 *
 * @param mixed $accessToken
 * @param bool $isValid
 * @return bool
 */
public static function isValidAccessToken($accessToken, bool $isValid): bool
{
    // 適当な認証判定
    return true;
}

カスタム

上記で実装した内容をSanctumで使用するようにAppServiceProviderで指示します。

AppServiceProvider.php
// Sanctumカスタム
Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);
Sanctum::authenticateAccessTokensUsing([PersonalAccessToken::class, 'isValidAccessToken']);

発行

準備完了です。任意のタイミングでPersonalAccessTokenを生成し保存します。

$personalAccessToken = new PersonalAccessToken();
$personalAccessToken->tokenable_type = PersonalAccessToken::class;
$personalAccessToken->tokenable_id = '1';
$personalAccessToken->name = 'API TOKEN';
$personalAccessToken->token = hash('sha256', $plainTextToken = Str::random(40));
$personalAccessToken->abilities = ['*'];
$personalAccessToken->save();

$personalAccessToken->tokenable_id = (string)$personalAccessToken->id;
$personalAccessToken->save();

return new NewAccessToken($personalAccessToken, $personalAccessToken->getKey() . '|' . $plainTextToken); 

このときtokenable_typeとtokenable_idに自分自身を指定するようにします。
Tokenの生成と返却はSanctumの実装を参考にしてください。

アクセス

生成されたトークン(returnされた文字列)をつかってリクエストします。

おわり

以上です。
お疲れさまでした。誰かの役に立てれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0