Laravel Passport 在收到访问令牌后不验证用户身份

问题描述 投票:0回答:2

我正在使用 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'));
的结果:

php laravel laravel-passport bearer-token laravel-10
2个回答
0
投票

当您从授权选项卡中选择

Bearer Token
作为类型时,您似乎在 Postman 中错误地传递了令牌。在这种情况下,您不必在令牌前添加
Bearer
,这就是您的令牌不匹配的原因。检查下面的屏幕截图,了解字符串
Bearer
如何在您的访问令牌前面添加两次。


相反,您只需将

access token
添加到应该解决问题的值即可。


0
投票

我认为您没有正确检索您的令牌。您必须将此值提供给用户

  $token = $user->createToken('MyApp')->plainTextToken;

所以你可以这样做

      $token = $user->createToken('MyApp')->plainTextToken;

        return response([
            'token' => $token
        ]);

如果您随后使用该 $token 字符串值作为您的 BearerToken,您应该没问题。

作为一个好的经验法则,您应该检查您的纯文本令牌是否以数字开头。

例如

29|NFAXFH5HRbZtdM1knfHTRXpB8VmVYkIlCELOB3ef0daf95da

纯文本令牌未存储在您的数据库中

© www.soinside.com 2019 - 2024. All rights reserved.