使用用户名而不是电子邮件进行JWTAuth身份验证

6

有没有办法在laravel中使用jwt-auth身份验证时使用用户名(或任何自定义列),而不是电子邮件?

这是现有的代码

public function authenticate(Request $request)
{
    $credentials = $request->only('email', 'password');

    try {
        // verify the credentials and create a token for the user
        if (! $token = JWTAuth::attempt($credentials)) {
            return response()->json(['error' => 'invalid_credentials'], 401);
        }
    } catch (JWTException $e) {
        // something went wrong
        return response()->json(['error' => 'could_not_create_token'], 500);
    }

    // if no errors are encountered we can return a JWT
    return response()->json(compact('token'));
}

我想做类似这样的事情

$credentials = $request->only('username', 'password');

一种方法是将用户名放在电子邮件列中,但这是一个不好的解决方案。
3个回答

4
我在这里找到了一种方法:这里
我们可以根据自定义字段从模型中获取用户,例如:
// 获取某个用户
$user = User::first();

并手动进行身份验证。

$token = JWTAuth::fromUser($user);

3

查阅资料后,发现可以通过以下方式设置凭证:$credentials = $request->only('username', 'password');

因此,全部内容看起来应该是这样的:

public function authenticate(Request $request)
    {
        // grab credentials from the request
        //$credentials = $request->only('email', 'password');
        // Change email to username
        $credentials = $request->only('username', 'password');

        try {
            // attempt to verify the credentials and create a token for the user
            if (! $token = JWTAuth::attempt($credentials)) {
                return response()->json(['error' => 'invalid_credentials'], 401);
            }
        } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            return response()->json(['error' => 'could_not_create_token'], 500);
        }

        // all good so return the token
        return response()->json(compact('token'));
    }

这对 Laravel 8 有用吗? - Fernando Torres
@FernandoTorres 抱歉,我不明白你的问题?$request->only()在Laravel 8中仍然有效... - James
我想问您,这个解决方案是否适用于 Laravel 8.x 版本,并使用最新版本的 jwt。 - Fernando Torres
@FernandoTorres 我不知道。我没有积极使用过这个包。你可以尝试一下。 - James

0
//Use case for login with email or username    
public function login(Request $request){
            // Request input contains username, email and password
            if ($request->has(['username', 'email', 'password'])) {
                $credentials = $request->only('email', 'password');
            } // Request input contains `enter code here`username and password
            elseif ($request->has(['username', 'password'])) {
                $credentials = $request->only('username', 'password');
            } // Request input contains email and password
            elseif ($request->has(['email', 'password'])) {
                $credentials = $request->only('email', 'password');
            }
            else {
                $credentials = $request->only('email', 'password');
            }

            try {
               if (!$token = JWTAuth::attempt($credentials)) {
                return response()->json(['invalid_email_or_password']);
               }
            } catch (JWTAuthException $e) {
                return response()->json(['failed_to_create_token'], 500);
            }
            return response()->json(compact('token'));
        }

请在您的代码中添加解释,因为仅有代码的帖子并不能真正回答问题(对于其他读者也没有太大帮助)。 - Nander Speerstra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接