繁体   English   中英

Laravel Sanctum API 非 SPA 代币

[英]Laravel Sanctum API Tokens for non SPA

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

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

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

谢谢

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

我能想到的解决方案就是不使用 Sanctum 和 api 路线。 Instead, use web routes and declare the api routes inside web.php (eg Route::get('/api/user'..). Then you can check whether the request is an api or web request inside controller or with a middleware并相应地返回一个视图或 json。这不是一个优雅的解决方案,但它可以工作。

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

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

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

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

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

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

暂无
暂无

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

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