仅使用 Lumen 中的电子邮件登录 (JWT Auth)

Posted

技术标签:

【中文标题】仅使用 Lumen 中的电子邮件登录 (JWT Auth)【英文标题】:Login with only email in Lumen (JWT Auth) 【发布时间】:2021-04-20 11:23:24 【问题描述】:

我想在登录系统时设置密码可选。如果用户输入密码,登录工作正常并返回 jwt 令牌,当我输入尝试仅使用电子邮件登录时,它会给出以下错误:-

Undefined index: password (500 Internal Server Error)

以下是我的登录方法的代码

public function authenticateUser($request)
    
        $input = $request->only('email','password');
        if (!$authorized = Auth::attempt($input, true)) 
            return $this->failure('Credentials doesnot match our records!', 401);
         else 
            $token = $this->respondWithToken($authorized);
            return $this->success('Login Successfully !', $token, 200);
        
    

protected function respondWithToken($token)
    
        return [
            'token' => $token,
            'token_type' => 'Bearer',
            'expires_in' => Auth::factory()->getTTL() * 60,
            'user' =>  Auth::user()
        ];
    

所以基本上,我想要的是当用户输入电子邮件时,它将登录并返回令牌,如果用户使用电子邮件和密码登录,那么它也应该工作并返回令牌。

【问题讨论】:

JWT 认证你用什么? 我正在使用我在 lumen 中安装的 jwt 身份验证包,并发送电子邮件和密码进行登录,但我希望密码可选,当我注册时,如果用户只想使用电子邮件注册,他将输入只有电子邮件和密码将为空 是的,你用的是什么包? jwt-auth.readthedocs.io/en/develop/lumen-installation @lagbox 你能帮我吗? 【参考方案1】:

您收到的错误意味着您通过请求发送的输入数组中没有 password 键。这发生在这一行:

$input = $request->only('email','password');

为了绕过它,您需要获取所有输入,或检查这些输入是否存在,然后从中读取:

//Get all inputs    
$input = $request->input();
//Or get email first, and then check for password
$input['email'] = $request->email;
$input['password'] = $request->filled('password') ? $request->password : null;

注意:由于我看不到您的实际登录功能,这可能仅适用于电子邮件,因为密码可能是必需的参数。如果是这种情况,您将不得不更改这些功能。

【讨论】:

你想看哪个登录功能?当我没有密码输入时,它询问“凭据与我们的记录不匹配” only 不会在结果中设置键,如果它不存在,它不会导致错误 @ArslanAkram Auth::attempt($input, true) 一个。我不确定这是你的函数还是外部包,但这可能需要密码始终存在。 @lagbox 我不知道,谢谢你告诉我! @zlatan ``` Auth::attempt($input , true) ``` 是内置函数,那不是我的函数【参考方案2】:

您可以创建一个自定义身份验证用户提供程序来解决这个可能缺少的“密码”字段。不过,我可能不会在这里。您可以自己检查输入以查看是否有密码。如果有通过attempt 正常传递。如果不存在使用配置的用户提供程序找到用户并登录到警卫(attempt 正在做什么)。

大概是这样的:

public function authenticateUser($request)

    if ($request->has('password')) 
        $token = Auth::attempt($request->only(['email', 'password']));
     else 
        $token = ($user = Auth::getProvider()->retrieveByCredentials($request->only(['email'])))
            ? Auth::login($user)
            : false;
    

    return $token
        ? $this->success('Login Successfully !', $this->respondWithToken($token), 200)
        : $this->failure('Credentials do not match our records!', 401);

【讨论】:

以上是关于仅使用 Lumen 中的电子邮件登录 (JWT Auth)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel/Lumen Tymon/JWT 通过电话号码和密码

Lumen JWT Auth登录成功后总是在其他路由返回401

Laravel / Lumen Auth JWT令牌在后续请求中无效,是否可能已过期?

在 Lumen 5.4 中注销后 JWT Auth 令牌不会失效

Laravel/Lumen Auth JWT 令牌在后续请求中无效,它可能已过期吗?

在流明 jwt 令牌中设置过期时间