刷新护照中的令牌时出现 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 为路线创建了三个文件,即 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 验证,并且只要它们的相应路由在 web.php
routes 文件中,您的普通表单仍然可以具有 csrf 保护.
几乎总是当解决方案涉及注释掉 \App\Http\Middleware\VerifyCsrfToken::class
时,通常几乎总是由于缺乏对 laravel 5.3+ 中的路由结构的适当研究。
与之前的版本相比,只有 1 个统一路由文件与拆分路由文件相比发生了重大变化。创建拆分路由文件只是为了启用中间件的单独应用程序。
希望有一天这对某人有所帮助。
我最近关注了关于如何在演示应用程序(博客)中正确安装和设置 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 为路线创建了三个文件,即 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 验证,并且只要它们的相应路由在 web.php
routes 文件中,您的普通表单仍然可以具有 csrf 保护.
几乎总是当解决方案涉及注释掉 \App\Http\Middleware\VerifyCsrfToken::class
时,通常几乎总是由于缺乏对 laravel 5.3+ 中的路由结构的适当研究。
与之前的版本相比,只有 1 个统一路由文件与拆分路由文件相比发生了重大变化。创建拆分路由文件只是为了启用中间件的单独应用程序。
希望有一天这对某人有所帮助。