【问题标题】:Get access token using refresh token使用刷新令牌获取访问令牌
【发布时间】:2015-07-19 04:31:19
【问题描述】:

我目前正在使用 thephpleague/oauth2 库实现 OAuth2。我已经添加了刷新令牌授权,并且访问令牌响应已经包含刷新令牌。但是,我不知道如何使用该刷新令牌来获取新的访问令牌。

我查看了文档,但没有看到任何相关内容。 oauth2-client 库有它的方法,但我不会使用它。

我的刷新令牌授权代码:

$server->setRefreshTokenStorage(new RefreshTokenStorage);

$refreshTokenGrant = new \League\OAuth2\Server\Grant\RefreshTokenGrant();
$authCodeGrant = new \League\OAuth2\Server\Grant\AuthCodeGrant();

$server->addGrantType($authCodeGrant);
$server->addGrantType($refreshTokenGrant);
$response = $server->issueAccessToken();

我的问题是如何使用刷新令牌进行测试,是否可以检索新的访问令牌?我是否必须实现一个不同于授权代码授予所使用的端点的新端点?

这是我获取令牌的代码。有cmets吗?

public function actionToken(){

    $authCodeModel = new \app\models\OAuth_Auth_Codes;

    if(!isset($_POST['code'])){
        throw new \yii\web\HttpException(400,"Required parameter \'code\' is missing or invalid.");
    }

    $result = $authCodeModel->find()->where(['authorization_code' => trim($_POST['code'])])->one();

    if(!empty($result)){

        $user_id = $result->user_id;

        $session2 = new Session();
        $session2->open();

        $server = new AuthorizationServer;
        $server->setSessionStorage(new SessionStorage);
        $server->setAccessTokenStorage(new AccessTokenStorage);
        $server->setClientStorage(new ClientStorage);
        $server->setScopeStorage(new ScopeStorage);
        $server->setAuthCodeStorage(new AuthCodeStorage);
        $server->setRefreshTokenStorage(new RefreshTokenStorage);

        $refreshTokenGrant = new \League\OAuth2\Server\Grant\RefreshTokenGrant();
        $authCodeGrant = new \League\OAuth2\Server\Grant\AuthCodeGrant();

        $server->addGrantType($authCodeGrant);
        $server->addGrantType($refreshTokenGrant);

        $response = $server->issueAccessToken();

        $model = new \app\models\OAuth_Access_Tokens();
        $accessTokenModel = $model->find()->where(['access_token' => $response['access_token']])->one();
        $accessTokenModel->setAttribute('user_id',''.$user_id);
        $accessTokenModel->save(FALSE);

        return json_encode($response);
    }
    else{
        throw new \yii\web\UnauthorizedHttpException("You have provided an invalid authorization code.");
    }
}

【问题讨论】:

    标签: php oauth-2.0


    【解决方案1】:

    在 PHP 中使用 cURL 支持:

    $postData = array(
        "grant_type" => "refresh_token",
        "client_id" => $clientID,
        "client_secret" => $clientSecret,
        "refresh_token" => $refreshToken
    );
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $tokenEndpoint);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
    $response = curl_exec($ch);
    curl_close($ch);
    $r = json_decode($response);
    echo $r->access_token;
    

    编辑: 服务器端示例见:https://github.com/thephpleague/oauth2-server/blob/master/tests/unit/Grant/RefreshTokenGrantTest.php,例如:

    $server = new AuthorizationServer();
    $grant = new RefreshTokenGrant();
    $server->addGrantType($grant);
    $server->issueAccessToken();
    

    【讨论】:

    • 谢谢汉斯。在我的实现中,令牌端点专门用于接受授权代码授予类型。我按照图书馆中给出的示例进行操作。是否有接受 refresh_token 授权类型的示例。我想知道生成令牌的部分。在authorization_code授权中,有一个issueToken()方法调用。
    • 我开始看到你真正想要的东西:使用我的客户端(第一个)代码来处理令牌端点;这两个授权的端点相同;只有一个这样的端点处理所有授权。
    • 是的。就是这样。我已经编辑了我的帖子以包含我获取令牌的代码。奇怪的是,当我更改响应类型时,客户端身份验证失败。
    猜你喜欢
    • 2020-02-26
    • 2013-08-23
    • 2022-01-23
    • 2016-09-28
    • 2015-11-26
    • 1970-01-01
    • 2019-06-29
    • 2017-03-22
    相关资源
    最近更新 更多