使用 PUT http 动词时通过查询参数传递 Oauth2 令牌?

Posted

技术标签:

【中文标题】使用 PUT http 动词时通过查询参数传递 Oauth2 令牌?【英文标题】:Passing Oauth2 token via query parameters when using PUT http verb? 【发布时间】:2013-09-25 08:21:03 【问题描述】:

我正在使用league\oauth2-server,并且当我使用GET http 动词时它可以正常工作。

但是,当我发出 PUT 请求时,我遇到了问题

调用未定义的方法 League\OAuth2\Server\Util\Request::PUT()

抛出这个错误的具体代码是一个函数Server/Resource.php file

$accessToken = $this->getRequest()->$method($this->tokenKey);

从函数

protected function determineAccessToken($headersOnly = false)

    if ($header = $this->getRequest()->header('Authorization')) 
        // Check for special case, because cURL sometimes does an
        // internal second request and doubles the authorization header,
        // which always resulted in an error.
        //
        // 1st request: Authorization: Bearer XXX
        // 2nd request: Authorization: Bearer XXX, Bearer XXX
        if (strpos($header, ',') !== false) 
            $headerPart = explode(',', $header);
            $accessToken = trim(preg_replace('/^(?:\s+)?Bearer\s/', '', $headerPart[0]));
         else 
            $accessToken = trim(preg_replace('/^(?:\s+)?Bearer\s/', '', $header));
        
        $accessToken = ($accessToken === 'Bearer') ? '' : $accessToken;
     elseif ($headersOnly === false) 
        $method = $this->getRequest()->server('REQUEST_METHOD');
        $accessToken = $this->getRequest()->$method($this->tokenKey);
    

    if (empty($accessToken)) 
        throw new Exception\InvalidAccessTokenException('Access token is missing');
    

    return $accessToken;

我正在使用 POSTMAN 请求客户端来测试请求

【问题讨论】:

【参考方案1】:

它抛出该错误是因为不允许对 Web 服务的 PUT 请求。这是有道理的,因为您真的不需要为 OAuth2 请求执行 PUT 请求。 PUT 告诉另一端的 RESTful 服务您正在尝试更新特定实体。 OAuth2 没有要更新的实体,只能检索。

也许更好地理解您正在尝试做的事情可能会解释您为什么使用 PUT,但对于 OAuth2,它应该始终是 GET 请求。

【讨论】:

我正在通过 oauth 进行所有身份验证,以便以前正确获取令牌等。该代码对 API 有一个通用请求,特别是对 /v1/users/1 的 put 请求,因此我正在尝试更新用户。实际上,我设法通过使用不记名授权标头而不是通过查询参数传递令牌来使其正常运行。【参考方案2】:

如果您将“http_headers_only”设置为 true 并在正确的标头中发送令牌,它应该可以工作。

通过正确的 HTTP 标头,我的意思是“授权:不记名”而不是 access_token:,这可以在您的邮递员屏幕截图中看到。另请注意,“Authorization”是键,值由“Bearer”关键字和您的令牌组成,以空格字符分隔。

【讨论】:

以上是关于使用 PUT http 动词时通过查询参数传递 Oauth2 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GAE 中覆盖 HTTP 请求动词

PUT 参数如何传递给页面?

使用带有 Angular 的 $http 的 PUT 方法时向查询字符串添加参数

Web API - 每个 HTTP 动词/参数组合只有 1 个操作?

如何让 PUT 和 DELETE 动词与 IIS 上的 Web API 一起使用

http put post请求区别