我正在使用 Laravel 10 和 Laravel Passport,在这个项目中,我尝试像这样注册新用户:
public function register(Request $request)
{
$request->validate([
'name' => 'required|max:255',
'email' => 'required|unique:users|max:255',
'password' => 'required|min:6'
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password)
]);
$token = $user->createToken('MyApp')->accessToken;
return response([
'token' => $token
]);
}
然后我在
api
中间件下定义了另一条路由:
Route::post('register',[AuthenticationController::class,'register']);
Route::middleware('auth:api')->group(function() {
Route::resource('products', ProductController::class);
});
在 ProductController 中,我尝试添加此方法来存储新产品:
public function store(Request $request)
{
$request->validate([
'title' => 'required|max:255',
'description' => 'required|max:255',
'price' => 'required'
]);
if ($request->user()) {
Product::create([
'title' => $request->title,
'description' => $request->description,
'price' => $request->price,
'user_id' => $request->user()->id
]);
return response([
'message' => 'product created successfully'
],201);
}else{
return response(['message' => 'User not authenticated.'], 401);
}
}
但是当我在 PostMAN 中测试 url 时,它是这样的:
http://localhost:8000/api/products
我收到这条消息:
{
"message": "Unauthenticated."
}
但是,我已复制并粘贴从
/register
端点检索到的令牌作为授权部分的 Token 输入:
我还将标题设置为
Accept
和 application/json
并将这些表单数据作为正文发送:
title:myproduct
description:The production desc
price:2000
我不知道为什么会收到此未经身份验证的消息,我还像这样配置了
auth.php
:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
并将此服务提供商添加到
app.php
:
Laravel\Passport\PassportServiceProvider::class,
并在用户模型中使用了正确的类:
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
...
}
那么这里出了什么问题呢?我该如何解决这个问题?
更新#1:
dd($user->createToken('MyApp'));
的结果:
我认为您没有正确检索您的令牌。您必须将此值提供给用户
$token = $user->createToken('MyApp')->plainTextToken;
所以你可以这样做
$token = $user->createToken('MyApp')->plainTextToken;
return response([
'token' => $token
]);
如果您随后使用该 $token 字符串值作为您的 BearerToken,您应该没问题。
作为一个好的经验法则,您应该检查您的纯文本令牌是否以数字开头。
例如
29|NFAXFH5HRbZtdM1knfHTRXpB8VmVYkIlCELOB3ef0daf95da
纯文本令牌未存储在您的数据库中