首页 > 解决方案 > 仅使用 Lumen 中的电子邮件登录 (JWT Auth)

问题描述

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

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

标签: laravelauthenticationjwtlumen

解决方案


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

推荐阅读