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】:我也遇到了比喻困难,没有直接的解决办法,所以在auth
attempt
之后我添加了自己的方法/逻辑来检查。
这是一个示例代码。
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.0
和 Laravel 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 8 tymon/jwt-auth 使另一个用户的令牌无效
Laravel6.0 使用 Jwt-auth 实现多用户接口认证