[英]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,
],
我意识到发生了两个问题:
sessions
表中。 是否仅在用户登录后才将新的单个会话插入到该表中? 用户登录后,在浏览器中手动刷新页面并调用受保护的路由时,我得到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.