【发布时间】:2022-11-02 13:13:23
【问题描述】:
背景
所以我在 Laravel 中使用 auth:sanctum 在 routes/api.php 上创建了一个安全流程,用于像这样的移动 API:
Route::middleware('auth:sanctum')->group(function () {
Route::get('profile', [UserController::class, 'profile']);
Route::post('profile_update', [UserController::class, 'updateProfile']);
Route::post('logout', [UserController::class, 'logout']);
});
我知道能够访问其中的 API,然后我需要一个 PersonalAccessToken,它可以像这样生成:
$user = M_CRM_CUSTOMER::where('indexs', $user_indexs)->first();
$tokenResult = $user->createToken($request->mobile)->plainTextToken;
这是代码将填充personal_access_tokens 表中记录的位置,该表在初始 Laravel 迁移中自动提供
Schema::create('personal_access_tokens', function (Blueprint $table) {
$table->id();
$table->morphs('tokenable');
$table->string('name');
$table->string('token', 64)->unique();
$table->text('abilities')->nullable();
$table->timestamp('last_used_at')->nullable();
$table->timestamp('expires_at')->nullable();
$table->timestamps();
});
案子
从技术上讲,只要 Token 在数据库中或只要它没有过期,那么我们就可以访问/使用它针对组中的 API,对吗?
如果您尝试使用 Postman 访问组中的 API,它将起作用。
现在,如果用户撤销令牌,使用:$token = $request->user()->tokens()->delete();
然后,如果我们尝试使用 Postman 访问组中包含的 API,会导致以 HTML 代码的形式显示失败从 Laravel 登录页面。
也许对于网络用户来说,这很有帮助且可见,但对于移动 API 用户呢?
肯定会出错。
期望
我的意思是我怎么知道如果用户已通过身份验证或有一个使用 Sanctum 的 PersonalAccessToken? 这样我就可以创建一个简单的返回消息,以防用户未通过身份验证。
试试 1
可能是因为我使用的是auth:sanctum,所以我无法使用Laravel's manual authentification 来知道用户是否经过身份验证,如下所示:
if (Auth::attempt($credentials)) {
// Do something if user is authenticated
}
它总是返回用户未通过身份验证,即使我已经像这样生成了 Sanctum 的令牌生成器:
$user->createToken($request->device_name)->plainTextToken;
试试 2
我也尝试过这样的检测:
if (!$request->user()->tokens()->where('tokenable_id', Auth::id())->first()) {
return 'Not Authenticated';
} else {
return 'Authenticated';
}
无论如何都会检测到令牌,但这是正确的方法吗?
请开导我,或者我只是误解了这个概念并使用了 Auth Sanctum 的功能?
谢谢
【问题讨论】:
标签: php laravel authentication laravel-sanctum