繁体   English   中英

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

[英]Laravel 5.6 - How to authenticate API using sessions for same folder SPA?

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

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

知道我们如何做到这一点吗?

更新1:

实施@ceejayoz的建议后:

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

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

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

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

这是可行的(对于某些应用程序,我自己也做过)。

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

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

看起来您的会话不是持久的。

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

您可以在此处检查默认的Sesion配置值

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

'same_site' => 'strict'

'same_site' => null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM