【问题标题】:TokenMismatchException when refreshing token in passport laravel在护照 laravel 中刷新令牌时出现 TokenMismatchException
【发布时间】: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,我更新了这个问题,引用了我用来注册路由的源代码。

标签: php laravel-5 laravel-passport


【解决方案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(以及其他?)攻击
      猜你喜欢
      • 2019-05-15
      • 2019-11-17
      • 2023-01-24
      • 2017-09-13
      • 2021-03-08
      • 2018-04-11
      • 2015-10-04
      • 2017-04-09
      • 2020-12-18
      相关资源
      最近更新 更多