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

Posted

技术标签:

【中文标题】使用用户名而不是电子邮件进行 JWTAuth 身份验证【英文标题】:JWTAuth authentication with username instead of email 【发布时间】:2016-07-26 17:48:58 【问题描述】:

有没有办法在 laravel jwt-auth 中使用 username(或任何自定义列)而不是 email 进行身份验证?

这是现有的代码

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');

一种方法是将 usernames 放在 email 列中,但这是一个不好的解决方案。

【问题讨论】:

【参考方案1】:
//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'));
        

【讨论】:

请为您的代码添加解释,因为仅包含代码的帖子并不能真正回答问题(并且对这个问题的其他读者没有多大帮助)。【参考方案2】:

我找到了方法here

我们可以从模型(基于自定义字段)中获取用户,例如

// 抓取一些用户

$user = User::first();

并手动进行身份验证。

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

【讨论】:

【参考方案3】:

Looking around,看起来可以通过像 $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 中使用有用吗? @FernandoTorres 抱歉,我不明白你的问题? $request->only() 在 Laravel 8 中仍然有效... 我在问你,如果这个解决方案在 Laravel 版本 8.x 中使用最新版本的 jwt 有效 @FernandoTorres 我不知道。我不积极使用这个包。你可以试试看。

以上是关于使用用户名而不是电子邮件进行 JWTAuth 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Django rest auth 电子邮件而不是用户名

使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?

使用 JWT Auth 对 LDAP 服务进行身份验证

django rest framework jwt 使用电子邮件和密码进行身份验证

rails 3 使用设备进行身份验证

使用 JWT - 以他们的电子邮件为主题对用户进行身份验证是不是可以?