刷新护照中的令牌时出现 TokenMismatchException laravel

TokenMismatchException when refreshing token in passport laravel

我最近关注了关于如何在演示应用程序(博客)中正确安装和设置 Laravel Passport 的官方文档。

我的路线是按照 these 说明设置的:

Next, you should call the Passport::routes method within the boot method of your AuthServiceProvider. This method will register the routes necessary to issue access tokens and revoke access tokens, clients, and personal access tokens:

在使用 Postman 运行 一些示例请求时,我注意到 oauth/token/refresh 路由需要 CSRF 令牌.

运行 artisan route:list 我得到了:

|        | POST     | oauth/token                             |                  | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken        | throttle     |
|        | POST     | oauth/token/refresh                     |                  | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh        | web,auth     |

关于如何正确刷新令牌有什么想法吗?

我上次所做的是从 kernel.php 禁用 CSRF,我真的不知道这是否是最佳做法,但我评论了:

 App\Http\Middleware\VerifyCsrfToken::class

CSRF 可以针对所需的 URI 禁用,如 https://laravel.com/docs/5.3/csrf 所述。例如,我在 VerifyCsrfToken class:

中的 $except 属性 中添加了一个值作为 URL 路径
protected $except = [
    'oauth/authorize',
];

而且有效。

好的。要一劳永逸地解决这个问题...如果您在 laravel 5.3+ 并且您必须在 App\Http\Kernel.php$middlewareGroups 中评论 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 验证,并且只要它们的相应路由在 web.php routes 文件中,您的普通表单仍然可以具有 csrf 保护.

几乎总是当解决方案涉及注释掉 \App\Http\Middleware\VerifyCsrfToken::class 时,通常几乎总是由于缺乏对 laravel 5.3+ 中的路由结构的适当研究。

与之前的版本相比,只有 1 个统一路由文件与拆分路由文件相比发生了重大变化。创建拆分路由文件只是为了启用中间件的单独应用程序。

希望有一天这对某人有所帮助。