そんなケースあまり無いと思いますが、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された文字列)をつかってリクエストします。
おわり
以上です。
お疲れさまでした。誰かの役に立てれば幸いです。