Laravel 和 jwt-auth。如何检查用户电子邮件是不是经过验证

Posted

技术标签:

【中文标题】Laravel 和 jwt-auth。如何检查用户电子邮件是不是经过验证【英文标题】:Laravel and jwt-auth. How to check if user email is verifiedLaravel 和 jwt-auth。如何检查用户电子邮件是否经过验证 【发布时间】:2019-05-03 00:59:49 【问题描述】:

我在 laravel 中使用 Jwt auth: "tymon/jwt-auth": "0.5.*"。我需要在 API 的登录调用中添加一个检查,以检查用户电子邮件是否经过验证。如果未验证,则返回错误消息。

我找不到它的代码。 “oauth/token” API 调用在哪里?

我找不到它的代码,因此我可以在那里集成该检查。

【问题讨论】:

授权用户时需要这个吗? github.com/tymondesigns/jwt-auth/wiki/Authentication @Tarasovych 是的,在用户登录授权期间,我需要检查电子邮件是否验证。 获取凭据后将您的逻辑放入authenticate() @Tarasovych 我试过了,但它并没有进入那个方法。我什至更改了控制器的名称,但它仍然有效。 @Tarasovych 您能否确认“/oauth/token”是否是 jwt 登录身份验证的默认路由?我问这个是因为我无法在 API.php 的任何地方找到这条路线,api 调用甚至没有进入控制器。那么它的代码还能在哪里呢? 【参考方案1】:

我可以指导你如何做到这一点。在用户表中添加列例如“已确认”并将其添加到用户模型中的可填充中。该列默认为 0 或 false,“validation_string”默认为空。并在用户注册后向他发送一个指向他的邮件的链接。当他点击链接时,他将访问您的网站链接,您将把 validation_string 设置为 null 并且该用户是有效的。当他登录时,他将获得 JWT 令牌,但在您生成令牌之前,并在验证用户名/电子邮件和密码后检查“已确认”是 1 还是真。就是这样:)

【讨论】:

我已经完成了你所说的一切,但我坚持:“但在你生成他令牌之前,并在验证用户名/电子邮件和密码后检查‘确认’是 1 还是真。 ”。我必须在哪里添加该支票?我无法在控制器中找到该代码。 在他的例子中:github.com/tymondesigns/jwt-auth/wiki/Creating-Tokens: return response()->json(compact('token'));在此之前,您可以添加 if 以检查数据库中的该字段,如果它也可以,则返回此令牌。 我试过了,这个文件对我没有任何改变,即使我删除了这个文件 API 继续运行不知道它要去哪里。我找不到我必须在其中进行任何更改的代码。 也许你使用了其他控制器或方法,检查路由 不,它甚至没有进入控制器,如果我删除控制器文件夹,它仍然会继续运行。它正在从其他地方获取用户数据。【参考方案2】:

我也遇到了比喻困难,没有直接的解决办法,所以在authattempt之后我添加了自己的方法/逻辑来检查。

这是一个示例代码。

public function login(Request $request)

    try
    
        $credentials = $request->only(['email', 'password']);
        if (!$token       = auth()->attempt($credentials))
        
            return response()->json(['error' => 'invalid credentials'], 401);
        
        //if you reached here then user has been authenticated
        if (empty(auth()->user()->email_verified_at))
        
            return response()->json(['error' => 'Your have not verified your email.'], 401);
        
        return response()->json([
                    'access_token' => $token,
                    'token_type'   => 'bearer',
                    'expires_in'   => auth()->factory()->getTTL() * 60
                        ], 200);
    
    catch (JWTException $e)
    
        // something went wrong whilst attempting to encode the token
        return response()->json(['error' => 'could not create token'], 500);
    

请注意:在上面的示例中,我使用了 tymon/jwt-auth v1.0Laravel v7

希望这会有所帮助!

【讨论】:

【参考方案3】:

这将验证传入的数据,尝试登录,然后检查他们的电子邮件验证状态。

注意 - 我正在使用自定义辅助方法来响应。

/**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(Request $request)
    
        $validator = Validator::make($request->all(), [
            'email' => 'required|email:filter',
            'password' => 'required|string|min:8',
        ]);

        if ($validator->fails()) 
            return $this->responseUnprocessable($validator->errors());
        

        if (! $token = auth()->attempt($validator->validated())) 
            return $this->responseUnauthorized();
        

        if (! auth()->user()->hasVerifiedEmail()) 
            return $this->responseForbidden('Please verify your email address before logging in. You may request a new link here [xyz.com] if your verification has expired.');
        

        return $this->createNewToken($token);
    

【讨论】:

以上是关于Laravel 和 jwt-auth。如何检查用户电子邮件是不是经过验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 7.0 - tymon/jwt-auth - 检查令牌是不是有效

如何使用 Laravel 5 设置 JWT-Auth

Laravel 8 tymon/jwt-auth 使另一个用户的令牌无效

Laravel6.0 使用 Jwt-auth 实现多用户接口认证

Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证

注销不适用于 Laravel JWT-auth