【问题标题】:why this post method from postman to Laravel route not working?为什么这种从邮递员到 Laravel 路线的邮寄方法不起作用?
【发布时间】:2020-11-07 02:46:15
【问题描述】:

我在 post 方法中添加了一个 CSRF/XSRF 令牌,但没有任何改变。

这是一个简单的路由方法:

//inside controller
function newuser(Request $request){
      $user = new User;
      $user->email = $request->email;
      $user->name = $request->name;
      $user->password=$request->password;
      $user->save();
      return "test success";
    }

//route 
Route::post('/adduser','UsersController@newuser')

这就是我从邮递员发送数据的方式:

//json 
}
    "name":"myusername",
    "email":"me@me.test",
    "password":"1234567"
}

//headers inputs (postman user interface)

Content-Type => application/json
X-CSRF-TOKEN => csrfToken

当我发送请求时,我得到了这个状态码作为标题的响应

419 : unknown status

注意 Get 方法有效

这是正确的方法吗?

【问题讨论】:

  • 我也不确切知道它是如何工作的,我认为从表单中很容易将其添加到隐藏输入中作为文档中的提及,但我想先在邮递员上验证它
  • 我试了一下,他们说错误,因为 Cookie 不是有效的 http 标头字段名称
  • 感谢您的信息,他们确实有 cookie 的一部分,我也会测试它。
  • 你可以添加你的,如果它工作我会接受它。

标签: php laravel


【解决方案1】:

在 Laravel 中启用 VerifyCSRFToken 后,您将需要在 Postman 请求中使用 cookie。要在您的请求中使用 cookie,请参阅SO Post

问题是Laravel的VerifyCsrfToken中间件在匹配时会在会话中寻找你的token,如下:

   /**
     * Determine if the session and input CSRF tokens match.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return bool
     */
    protected function tokensMatch($request)
    {
        $token = $this->getTokenFromRequest($request);

        return is_string($request->session()->token()) &&
               is_string($token) &&
               hash_equals($request->session()->token(), $token);
    }

Laravel 获取会话的方式是从 cookie 中获取的。因此,为了让 Laravel 验证 CSRF 令牌,您还需要将会话 ID 与请求一起发送到 cookie 中。

你可以在http响应头SET-COOKIE:xxx_session='sometoken'中找到你想使用的会话ID

然后您可以将xxx_session=... cookie 添加到您要发出的请求中。

此外,GET 方法应该可以工作,因为 GET 路由不受 CSRF 保护。这就是为什么您永远不应该拥有修改应用程序状态的 GET 路由的原因之一。

【讨论】:

  • 谢谢,你能具体说说在哪里添加这段代码吗?
  • 用邮递员发送 cookie 已解决,但仍无法与 post 方法通信,我已在我的方法中添加您的代码来处理令牌,但它仍然返回相同的状态 419
  • @AzizMobarak 您在 cookie 中有会话,在标头中有 XSRF 令牌?
  • 在邮递员中,当您授权 cookie 时,您可以使用键 Cookie 在标题字段中发送它,我做到了,我也添加了 SET-COOKIE:xxx_session='sometoken'
  • @AzizMobarak 您在请求中不需要 SET-COOKIE,这样您就可以从响应标头中找到会话。您还需要确保您使用的是来自同一会话的 XSRF 令牌。即)您以匿名用户的身份向公共页面发出获取请求,查看响应标头并确定 xsrf 令牌和会话。然后,您获取这些值,如果您将 XSRF 令牌放在标头中,并且将会话 cookie 放在请求 cookie 中,您就可以发布帖子。
猜你喜欢
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多