2015-05-08 4 views
1

В настоящее время я реализую OAuth2 с помощью thephpleague/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(); 

Моего вопрос, как я могу проверить, что с помощью токена обновления, я могу получить новый маркер доступа? Должен ли я реализовывать новую конечную точку, отличную от той, которая используется в разрешении кода авторизации?

Вот мой код для получения токена. Любые комментарии?

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."); 
    } 
} 

ответ

1

Использование локонов поддержку в PHP было бы:

$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; 

Edit: Для стороне сервера примеров см: https://github.com/thephpleague/oauth2-server/blob/master/tests/unit/Grant/RefreshTokenGrantTest.php и т.д .:

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

спасибо Ганса. В моей реализации конечная точка маркера была специально сделана для принятия типа разрешения кода авторизации. Я последовал примеру, приведенному в библиотеке. Есть ли пример принятия типа типа refresh_token. Мне интересно о части, где генерируется токен. В гранте authorization_code существует вызов метода issueToken(). – jackeblagare

+0

, если вы имеете в виду код на стороне сервера, см. Edit –

+0

Я отредактировал мой оригинальный вопрос. – jackeblagare

Смежные вопросы