【问题标题】:Laravel JWT AUTH only returns TRUE/FALSELaravel JWT AUTH 只返回 TRUE/FALSE
【发布时间】:2022-01-23 19:11:32
【问题描述】:

如果我这样设置 auth.php -->>

 'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

登录维护如果我去主页,并且返回令牌只是真/假值 像这样 {"access_token":true,"token_type":"bearer","expires_in":3600}

如果我设置了身份验证

 'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],

进入主页时无法保持登录,但令牌会像这样返回正常

{"access_token":eY ....bla bla.....,"token_type":"bearer","expires_in":3600}

我该如何解决? 这是一个两难的选择。

我的完整代码在这里 https://github.com/sksmsWKd/MetaComposerProto

【问题讨论】:

    标签: laravel jwt


    【解决方案1】:

    设置应用的 Laravel 身份验证有几个要求。

    您似乎选择了 Sanctum 作为您的身份验证提供者。

    编辑:我似乎忽略了用户使用 Tymon/JWT-Auth 而不是 Passport/Sanctum 的事实。请在下面查看我的拆分答案。

    根据sanctum documentation,您需要将 HasApiTokens 特征添加到您的用户模型类(您的用户模型缺少此特征)。此 trait 使您的模型能够发出访问令牌(通过 createToken() 方法)

    (对于 Tymon/JWT-Auth,您需要遵循他们的 documentation 用户模型要求。)

    此外,在您的 app/Http/Controllers/AuthController.php 中,

    您的登录方法使用 auth()->attempt() 函数根据存储在数据库中的凭据来验证用户的凭据。这个特定的函数将始终返回真/假,因此将结果存储在 $token 变量中没有帮助,如下所示:

     if (!$token = auth()->attempt($credentials)) {
    

    你需要做的是:

    护照/圣所:

    检查尝试()是否成功(即,将其包装在 if/else 块中)然后自己发出访问令牌:

    if (auth()->attempt($credentials)) {
        $user = Auth::user();
        $token = $user->createToken('Your Token Name');
        return $this->respondWithToken($token);
    } else {
        return response()->json(['error' => 'Unauthorized'], 401);
    }
    

    对于 TYMON/JWT-AUTH:

    Tymon/Jwt-Auth 通过在成功时返回令牌或在失败时返回 false 来更改尝试 () 函数的工作方式,因此,将您的 login() 代码更改为:

    $token = auth()->attempt($credentials);
    if($token === false){
        return response()->json(['error' => 'Unauthorized'], 401);
    }
    return $this->respondWithToken($token);
    

    其他用户注意事项:我使用了 sksmsWKd 的自定义 respondWithToken 包装函数来返回令牌,但显然您可以根据需要只返回 $token 本身。即:

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

    至于您的 config/auth.php 配置,将默认保护设置为“web”是非常标准的。 Web Guard 在应用导航期间使用 cookie 来携带访问令牌。

    希望以上对你有所帮助。

    问候,

    弗里茨。

    【讨论】:

    • 非常感谢您的帮助。你的解释很有帮助。我想再问你一件事,我现在正在使用 Tymon\JWTAuth。当我使用您的新代码时,访问令牌返回与通常的 jwt 令牌完全不同。我可以像这样更改代码吗? ``` if (auth()->attempt($credentials)) { $token = JWTAuth::attempt($credentials);返回 $this->respondWithToken($token); } else { return response()->json(['error' => 'Unauthorized'], 401); } ```
    • @sksmsWKd,请参阅上面的更新答案。
    • 非常感谢。如果我使用 google oauth 登录,则没有 $credentials 。获取用户信息后我应该只做token吗?
    猜你喜欢
    • 2015-03-03
    • 2015-03-17
    • 2017-05-11
    • 2019-09-12
    • 2019-06-28
    • 2018-01-07
    • 2019-05-24
    • 2016-06-08
    • 2014-11-22
    相关资源
    最近更新 更多