在护照 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 为路由创建了三个文件,即webconsoleapi

然后,Taylor 继续在 Kernel.php 中的 protected $middlewareGroup 行之前创建了一条评论,说 The application's route middleware groups.。然后他将中间件组分隔为webapi

因此,如果您查看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的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 护照创建令牌和刷新令牌

Laravel 护照刷新令牌

我应该在laravel护照刷新令牌上放什么?

用于生成的 Laravel 护照令牌

Laravel 护照延长访问令牌过期时间

护照密码授予令牌刷新