每次我输入错误密码时,使用 JWT 身份验证的 Laravel 多重身份验证

Posted

技术标签:

【中文标题】每次我输入错误密码时,使用 JWT 身份验证的 Laravel 多重身份验证【英文标题】:Laravel Multiple Auth using JWT auth every-time i get wrong password 【发布时间】:2018-07-05 10:26:37 【问题描述】:

我有 2 个用户,即用户和总线,对于他们,我有不同的模型 我正在使用 laravel 5.5 和 tymondesigns/jwt-auth 1.0.0-rc.1 版本

用户非常适合用户我也得到令牌 但是公交车用户我们得到'invalid_email_or_password'

链接到完整代码full source code link

这是我的用户模型:

    class User extends Authenticatable implements JWTSubject
use Notifiable;
protected $fillable = ['name', 'email', 'password'];
public function getJWTIdentifier()

    return $this->getKey();

public function getJWTCustomClaims()

    return [];
  

我的配置/auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],

    'bus' => [
        'driver' => 'session',
        'provider' => 'buses',
    ],
    'bus-api' => [
        'driver' => 'jwt',
        'provider' => 'buses',
    ],
],

我的提供者是:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ],

    //next
    'buses' => [
        'driver' => 'eloquent',
        'model' => App\Bus::class,
    ],

我的 我的总线登录控制器正在获取用户表的用户名和密码

    public function busLogin(Request $request)

    \Config::set('jwt.user', "App\Bus");
    \Config::set('auth.providers.users.model', \App\Bus::class);
    $credentials = $request->only('email', 'password');
    try 
        \Config::set('jwt.user', "App\Bus");
        \Config::set('auth.providers.users.model', \App\Bus::class);
        if (!$token = JWTAuth::attempt($credentials)) 
            \Config::set('jwt.user', "App\Bus");
            \Config::set('auth.providers.users.model', \App\Bus::class);
            return response()->json([
                'response' => 'error',
                'message' => 'invalid_email_or_password',
            ]);
        
     catch (JWTAuthException $e) 
        return response()->json([
            'response' => 'error',
            'message' => 'failed_to_create_token',
        ]);
    
    return response()->json([
        'response' => 'success',
        'result' => [
            'token' => $token,
            'message' => 'I am Admin user',
            'user' => '99',
        ],
    ]);

我的路线 api:

Route::post('bus/auth/login', 'Bus\Auth@busLogin');
Route::post('bus/auth/register', 'Bus\Auth@busRegister');

每当我尝试使用总线模型用户名和密码登录时,我都会在总线控制器登录路径中登录无效,但如果我尝试使用用户模型凭据登录,我会得到令牌作为回报 如何使用 jwtauth 和 laravel 5.5 设置多个身份验证

【问题讨论】:

您在哪里设置用户和总线的身份验证保护?核心?路由服务提供者?我会很有帮助的。 我在这里设置 config/auth.php 的完整源代码link。谢谢 在您的问题中发布代码会更有用。当一个简单的编辑会走得更远时,我宁愿不挖掘你的存储库。 @btl 。 i config/auth.php 已经在上面给出了提前感谢 你误会了,你在哪里设置路由将使用哪个守卫?以Route::group(['middleware' => ['auth:api',...], function () ...routes...); 为例。 【参考方案1】:

config/auth.php 中的提供者无需更改。

您可以按如下方式更改每个控制器中的 __construct 函数。以便 jwt 知道要验证哪个模型。

总线控制器

function __construct()

    Config::set('jwt.user', Bus::class);
    Config::set('auth.providers', ['users' => [
            'driver' => 'eloquent',
            'model' => Bus::class,
        ]]);

管理员控制器

function __construct()

    Config::set('jwt.user', Admin::class);
    Config::set('auth.providers', ['users' => [
            'driver' => 'eloquent',
            'model' => Admin::class,
        ]]);

【讨论】:

【参考方案2】:

您只需要在路由api中的路由调用之前设置以下代码

\Config::set('jwt.user', "App\Bus");
\Config::set('auth.providers.users.model', \App\Bus::class);

【讨论】:

以上是关于每次我输入错误密码时,使用 JWT 身份验证的 Laravel 多重身份验证的主要内容,如果未能解决你的问题,请参考以下文章

在 ionic 3 应用程序中使用 JWT 进行身份验证

每次Access连接到SQL Server而不使用Windows身份验证时,如何避免手动输入登录名和密码

win10 远程桌面远程电脑时每次要输入密码及身份验证错误,要求的函数不受支持问题解决

使用 jwt 身份验证保护反应应用程序

ASP.NET Core JWT/Windows 身份验证 HTTP 400 错误

Jwt 身份验证问题 - 凭据无效