【问题标题】:Getting response as 'Unauthorized' while sending access token via URI Query Parameter通过 URI 查询参数发送访问令牌时获取“未授权”响应
【发布时间】:2016-02-20 15:55:13
【问题描述】:

我们正在使用 YII 框架创建 REST API 并实现 oAuth 2。

我们面临一个奇怪的问题,当我们尝试访问资源并通过“授权请求标头字段”发送访问令牌时,我们得到了预期的输出。 例如 curl -i -H "Accept:application/json" -H "Authorization: Bearer XXXXXX"

而当我们尝试通过“URI 查询参数”发送访问令牌时,我们得到的响应是“未授权”。

例如

https://server.example.com/resource?access_token=XXXXXX&p=q

您的建议对我们很有帮助。

【问题讨论】:

    标签: api rest oauth-2.0 yii2


    【解决方案1】:

    RFC 6750 (Bearer Token Usage) 定义了 3 种将访问令牌传递给受保护资源端点的方法。

    1. 通过授权标头。 (2.1. Authorization Request Header Field)
    2. 通过表单参数 access_token。 (2.2. Form-Encoded Body Parameter)
    3. 通过查询参数 access_token。 (2.3. URI Query Parameter)

    其中只有第一种方式是强制性的。您的授权服务器似乎不支持第三种方式。

    添加评论

    下面是一个支持 PHP 中所有 3 种方式的示例。有关详细信息以及 Ruby 和 Java 中的其他示例,请参阅“Protected Resource”中的“3. Extract Access Token”。

    /**
     * Function to extract an access token from a request.
     */
    function extract_access_token()
    {
        // The value of Authorization header.
        $header = $_SERVER['HTTP_AUTHORIZATION'];
     
        // If the value is in the format of 'Bearer access-token'.
        if ($header != null && preg_match('/^Bearer[ ]+(.+)/i', $header, $captured))
        {
            // Return the value extracted from Authorization header.
            return $captured;
        }
     
        if ($_SERVER['REQUEST_METHOD'] == 'GET')
        {
            // Return the value of 'access_token' query parameter.
            return $_GET['access_token'];
        }
        else
        {
            // Return the value of 'access_token' form parameter.
            return $_POST['access_token'];
        }
    }
    

    我不知道 Yii,但我的猜测是该框架不包含上述代码。

    【讨论】:

    • Takahiko你是说授权服务器的操作系统不支持第三种方式还是授权服务器中运行的php yii应用程序不支持第三种方式?
    • 操作系统无关紧要。相反,这只是受保护资源端点的实现中的一个问题。请参阅我的答案中的补充内容。
    • 感谢 Takahio,您的意见对我们帮助很大。 Yii2 默认支持“授权请求头字段”,我们更新了端点以支持“URI 查询参数”。要扩展的文件:HttpBearerAuth.php
    猜你喜欢
    • 2018-06-13
    • 1970-01-01
    • 2018-04-04
    • 2021-08-22
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多