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

Login with only email in Lumen (JWT Auth)

我想在登录系统时将密码设为可选。如果用户输入密码,登录工作正常并且 return 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()
        ];
    }

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

您收到的错误意味着您通过请求发送的输入数组中没有 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;

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

您可以创建一个自定义身份验证用户提供程序来解决这个可能缺失的 'password' 字段。虽然,我可能不会在这里。您可以自己检查输入,看是否有密码。如果有像往常一样通过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);
}