在护照 laravel 中刷新令牌时出现 TokenMismatchException
Posted
技术标签:
【中文标题】在护照 laravel 中刷新令牌时出现 TokenMismatchException【英文标题】:TokenMismatchException when refreshing token in passport laravel 【发布时间】:2017-09-13 15:20:59 【问题描述】:我最近关注了有关如何在演示应用程序中正确安装和设置 Laravel Passport 的官方文档(博客)。
我的路线是按照these 说明设置的:
接下来,您应该在引导中调用 Passport::routes 方法 AuthServiceProvider 的方法。该方法将注册 颁发访问令牌和撤销访问令牌所需的路由, 客户端和个人访问令牌:
在使用 Postman 运行一些示例请求时,我注意到 oauth/token/refresh 路由需要 CSRF 令牌。
运行工匠路线:我得到的列表:
| | POST | oauth/token | | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken | throttle |
| | POST | oauth/token/refresh | | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh | web,auth |
关于如何正确刷新令牌的任何想法?
【问题讨论】:
您已将刷新路由设置为在不应该使用web
中间件时使用。
我使用Passport::routes
注册了路由,如文档中所述。那会是一个错误吗?
这不是错误。你在哪里打电话给Passport::routes()
?它应该在routes\api.php
而不是routes\web.php
@jfadich,我更新了这个问题,引用了我用来注册路由的源代码。
【参考方案1】:
可以为所需的 URI-s 禁用 CSRF,如 https://laravel.com/docs/5.3/csrf 所述。例如,我在 VerifyCsrfToken 类的 $except 属性中添加了一个值作为 URL 路径:
protected $except = [
'oauth/authorize',
];
它有效。
【讨论】:
【参考方案2】:好的。要一劳永逸地解决这个问题...如果您使用的是 laravel 5.3+,并且您必须在 $middlewareGroups
App\Http\Kernel.php
评论 App\Http\Middleware\VerifyCsrfToken::class
。你是一个星际文件阅读回避者,你应该被超女说服并绳之以法:-(
开个玩笑。我们都被赶上了。
撇开双关语不谈,有一个更好的解决方案,而且很明显,就是这样。
Taylor 为路由创建了三个文件,即web
、console
和api
。
然后,Taylor 继续在 Kernel.php 中的 protected $middlewareGroup
行之前创建了一条评论,说 The application's route middleware groups.
。然后他将中间件组分隔为web
和api
。
因此,如果您查看web
$middlewareGroup... 它包含VerifyCsrfToken::class
,但api
中间件组不包含。答案已经摆在我们面前!
因此,如果您将您的路由放在 routes 文件夹下的 api.php
文件中,那么您将永远不会进行 csrf 验证,并且您的普通表单仍然可以具有 csrf 保护,只要它们对应的路由在 web.php
路由文件中。
当解决方案涉及注释掉 \App\Http\Middleware\VerifyCsrfToken::class
时,几乎总是因为缺乏适当研究 laravel 5.3+ 中的路由结构。
与之前的版本相比,在只有 1 个统一路由文件与拆分路由文件方面发生了重大转变。创建拆分路由文件仅是为了启用中间件的单独应用。
希望有一天这对某人有所帮助。
【讨论】:
【参考方案3】:我上次做的是从 kernel.php 禁用 CSRF,我真的不知道这是否是最佳做法,但我注释掉:
App\Http\Middleware\VerifyCsrfToken::class
【讨论】:
不建议这样做,因为它会使您的应用程序容易受到 csrf(以及其他?)攻击以上是关于在护照 laravel 中刷新令牌时出现 TokenMismatchException的主要内容,如果未能解决你的问题,请参考以下文章