【问题标题】: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 调用甚至没有进入控制器。那么它的代码还能在哪里呢?

标签: php laravel api jwt


【解决方案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);
        }
    

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多