0

简而言之:会话保护驱动程序拒绝我的登录尝试。

在创建 Laravel UI 之前,我已经使用 JWT 作为 api 保护驱动程序为我的前端创建了一个身份验证系统。

我安装了 Laravel UI 以使用 Spatie 权限包,该包也已安装并生成了一些额外的表。

安装 Laravel UI 后,我成功注册了一个新用户,但没有重定向到主屏幕。我尝试以新用户身份登录,但收到回复说我的凭据未被识别。然后,我尝试使用先前通过前端注册在用户表中创建的用户登录...

虽然这次它没有给出错误,但它仍然没有重定向我。然后我尝试使用新创建的用户登录前端应用程序并且能够这样做。在这一点上,我认为令牌存在冲突。

我查看了 RegisterController.php 并看到以下内容:

    protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
}

我的前端 JWT 身份验证系统也使用了 User.php,所以我看了一下,发现密码被加密了两次。首先使用 Hash::,然后使用 bcrypt。因此,我删除了哈希加密。

我注册成功,但再次没有被重定向到家。我尝试再次登录,但再次无法登录,但这次我没有收到错误消息!注册用户现在的行为方式与通过前端应用程序注册的用户相同。

我逐行浏览了代码,花费了数小时注销值等,并且可以看到所有内容都被接受并且我重定向到家,但是 HomeController.php 然后将我的凭据传递给当时拒绝的身份验证守卫然后将我重定向回登录!

我可以访问主页的唯一方法是将 HomeController.php 中的中间件从“auth”更改为“guest”:

    public function __construct()
{
    $this->middleware('guest'); // changed from 'auth'
}

在 Spatie 文档中,它说明了以下内容:

如果你的应用只使用了一个守卫,但不是 web 的(Laravel 的默认设置,它在 auth 配置文件中显示“first”),然后更改 config/auth.php 中列出的守卫的顺序,将你的主要守卫列为默认并作为已定义警卫列表中的第一个。在您编辑该文件时,最好也删除任何您不使用的防护措施。

因此,我在 config/auth.php 中切换了守卫,以便首先使用 api 但它没有效果。

    'guards' => [

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

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

前端使用 api 保护,后端使用 web,但它们都使用相同的应用程序/用户。我想这一定是问题的原因,但我是 Laravel 的新手,经过数小时的阅读和测试,我仍在苦苦挣扎。它想要我错过什么!?密码现在被接受了,所以不能这样..

任何帮助将不胜感激。谢谢你。

4

1 回答 1

0

问题出在我错过的 config/auth 的顶部:

        'defaults' => [
        'guard' =>'api',
        'passwords' => 'users',
        ],

这并不是说我被 web 会话驱动程序拒绝了——而是 web 守卫被上面默认部分中的 api 守卫覆盖了。

我必须在路由中指定我想要的中间件以避免默认值:

Route::get('/home', [
'middleware' => 'auth:web', 'uses' => 'HomeController@index'])->name('home');

编辑:由于 auth:web 仅由几个控制器使用,更好的解决方案是将 config/auth 中的默认保护更改为 web,然后与使用 api 保护的其余部分一起执行 Route::group:

Route::group([

    'middleware' => 'api'

], function () {

    Route::post('login', 'AuthController@login');
    Route::post('register', 'AuthController@register');
    Route::post('logout', 'AuthController@logout');
    Route::post('refresh', 'AuthController@refresh'); 
});
于 2020-04-11T05:12:53.860 回答