用于非 SPA 的 Laravel Sanctum API 令牌

Posted

技术标签:

【中文标题】用于非 SPA 的 Laravel Sanctum API 令牌【英文标题】:Laravel Sanctum API Tokens for non SPA 【发布时间】:2021-06-04 21:03:37 【问题描述】:

我最近将一个旧应用升级到 Laravel 8 并随后安装了 Sanctum 用于 api 身份验证。当前端是 SPA 时,我了解 Sanctum 的用例,但由于我的应用程序是旧版,它使用 react 和 Laravel 刀片视图的组合。

当用户登录时,它会生成一个令牌,然后您只能在其中看到一次纯文本令牌,这对于 SPA 来说很好,因为它可以存储在全局状态中。

我的问题是,当应用不是具有全局状态的 SPA 时,最佳做法是什么。例如,如果我有经过身份验证的用户的路由,我不想为每个请求生成一个令牌。我曾考虑将令牌存储为 cookie 并为每个 api 请求使用 cookie 值,但这对我来说似乎不是一个好习惯。

谢谢

【问题讨论】:

【参考方案1】:

我也有这个问题。尽管文档没有具体提及,但似乎 Sanctum 仅适用于 SPA。非 SPA,您可以在新选项卡中打开链接(或只是在新选项卡上输入相同的 url)显然不会进行相同的身份验证。使用cookie是正确的,cookie值可能被窃取。

我能想到的解决方案就是不使用 Sanctum 和 api 路由。相反,使用 web 路由并在 web.php 中声明 api 路由(例如 Route::get('/api/user'..)。然后您可以检查请求是控制器内部还是中间件的 api 或 web 请求并相应地返回一个视图或 json。这不是一个优雅的解决方案,但它有效。

【讨论】:

【参考方案2】:

基于令牌的身份验证与您的应用程序是否为 SPA 无关。 整个想法是为用户生成一个令牌,并且这个相同的令牌应该与所有需要验证的请求一起发送,如果您在这部分遇到问题,请检查Laravel documentation。

您可以使用 cookie、http-cookie、local-storage 或 global state 将令牌存储在前端。

一旦您在请求的标头中发送令牌,您基本上就是在告诉 Laravel 谁是经过身份验证的用户,您不需要为每个请求创建一个令牌,因为为用户创建的相同令牌可以使用直到它过期(也可以查看上面的链接了解更多信息)

关于良好做法,将令牌存储在 cookie/local-storage 中会使您的网站容易受到 XSS attacks 的攻击,

当攻击者使用 Web 应用程序将恶意代码(通常以浏览器端脚本的形式)发送给不同的最终用户时,就会发生 XSS 攻击。

您必须验证/编码可能对其他用户可见的任何用户内容以防御 XSS。当然要自己研究并应用您认为最好的方法。

【讨论】:

以上是关于用于非 SPA 的 Laravel Sanctum API 令牌的主要内容,如果未能解决你的问题,请参考以下文章

带有 Sanctum 身份验证的 Laravel 8 (Reactjs SPA)

带有 Vuejs 的 Laravel 7.x Sanctum (SPA) 总是返回 401 Unauthorized

Laravel 8 Sanctum SPA Auth - 未按要求设置会话存储

Sanctum 和 Postman 的 SPA 身份验证问题

如何使用 Laravel Sanctum 处理 SPA 和基于令牌的身份验证

Laravel Sanctum Token API 身份验证在 Postman 中不起作用