Laravel 5.6-如何使用同一文件夹SPA的会话对API进行身份验证?

时间:2019-01-15 22:45:28

标签: php laravel laravel-5 laravel-authentication

我在同一Laravel项目中有一个React SPA。登录/注册/注销和所有其他js视图位于js文件夹中,并对所有POST/GET请求使用axios api调用。我想对嵌入式SPA使用默认的基于Laravel会话的Web身份验证,因为它位于同一项目文件夹中,并且将是 only 的javascript客户端访问它。此api无需向公众开放,仅适用于此react应用,它是SPA的代表,它具有速度和良好的用户体验,而无需重新加载整个页面。

我以前尝试过使用Passport,而且一个多月以来,我仍然无法使其按预期工作。我不想处理令牌,访问令牌,刷新令牌,吊销令牌,CSRF等。只是开箱即用的基于Laravel会话的简单身份验证,在Web上如此轻松地工作,但是希望它在我的react应用程序上工作。唯一的刀片文件是index.blade.php,其中包含反应app.js

有什么想法我们可以做到吗?

更新1:

实施@ceejayoz的建议后:

  

您必须在其中添加各种Session / Cookie中间件   app / Http / Kernel.php(类似   \ Illuminate \ Session \ Middleware \ StartSession :: class)到API路由。

我添加到$middlewareGroups.api中以匹配web中的app/Http/Kernel.php中间件:

'api' => [
    'throttle:60,1',
    'bindings',
    // Newly added middleware to match web middleware
    \App\Http\Middleware\EncryptCookies::class
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

我意识到发生了两个问题:

  1. 在会话表中,即使未登录,在加载应用程序主页(或任何页面)时,多个会话也会插入到sessions表中。用户登录后,不应该将新的单个会话插入该表吗?
  2. 用户登录后,在浏览器中手动刷新页面并调用受保护的路由时,我得到一个401 Unauthenticated,它在Illuminate/Auth/GuardHelpers.php中指向该方法:

    public function authenticate() {
        if (! is_null($user = $this->user())) {
            return $user;
        }
    
        throw new AuthenticationException; // throws this 401 exception on logged in page refresh when fetching data from private route
    }
    

一些附加说明:

  • config/auth.php中,我将guards.api.driver更改为session,而不是token
  • routes/api.php中,我将受保护的路由包装在auth中间件中,如下所示:Route::group(['middleware' => 'auth'], function() { PRIVATE ROUTES HERE }
  • config/session.php中,我有'domain' => '.mydomain.com'
  • 我将每个axios api请求发送回这些标头,如下所示:

    window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
    let token = document.head.querySelector('meta[name="csrf-token"]');
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
    

您知道如何解决这两个问题吗?

2 个答案:

答案 0 :(得分:1)

这是可行的(我对某些应用也做了同样的事情。)

默认情况下,routes/api.php中的路由没有可用的会话,但是您可以将app/Http/Kernel.php中的各种Session / Cookie中间件(类似\Illuminate\Session\Middleware\StartSession::class的东西)添加到API路由中

您也可以按照@ljubadr的建议,将API路由直接放在routes/web.php中,尽管这可能意味着您需要进行其他更改(例如从网络路由中删除CSRF保护)。

答案 1 :(得分:1)

好像您的会话不是持久的。

检查是否更改了config/session.php中可能会引起问题的任何值。

您可以检查默认的Sesion配置值here

通过评论,@ Wonka通过更改解决了他的问题

'same_site' => 'strict'

'same_site' => null