2016-07-19 4 views
3

Я использую HWIO Bundle для google api, и когда у меня есть ответ от google refreshToken = null, почему? Как обновить токенGoogle api refresh_token null и как обновить токен доступа

oAuthToken = {HWI\Bundle\OAuthBundle\Security\Core\Authentication\Token\OAuthToken} [11] 
accessToken = "ya29.Ci8lA1JTu9CB81dOFy-nzszViRgCI2CvvKVrCd0Lq-8I0QR_dIrl-_7RccdGt1Islg" 
rawToken = {array} [4] 
access_token = "ya29.Ci8lA1JTu9CB81dOFy-nzszViRgCI2CvvKVrCd0Lq-8I0QR_dIrl-_7RccdGt1Islg" 
token_type = "Bearer" 
expires_in = 3578 
id_token = "xxxxx" 
refreshToken = null 
expiresIn = 3578 
createdAt = 1468957368 
tokenSecret = null 
resourceOwnerName = null 

, потому что в/apiclient "версии" Google: "1.1.7" в функции нужно refresh_token

public function getRefreshToken() 
{ 
    if (array_key_exists('refresh_token', $this->token)) { 
    return $this->token['refresh_token']; 
    } else { 
    return null; 
    } 
} 

это мой маркер доступа

{"access_token":"ya29.Ci8lA1JTu9CB81dOFy-nzszViRgCI2CvvKVrCd0Lq-8I0QR_dIrl-_7RccdGt1Islg","token_type":"Bearer","expires_in":3578,"id_token":"xxxx","created":1468957368}

не нужно обновлять токен, потому что из google get refreshToken = null или нужно установить значение null с токеном обновления ключа или этим донтом?

$isExpired = $client->isAccessTokenExpired(); // true (bool Returns True if the access_token is expired.) 
    $refresh = $client->getRefreshToken(); //null because not gahe refresh token 

    $client->getGoogleClient()->setAccessType ("offline"); //some recomendation 
    $client->getGoogleClient()->setApprovalPrompt ("force"); //some recomendation 

    $isAgainExpired = $client->isAccessTokenExpired(); // still true (expired) 

еще исключение - The OAuth 2.0 access token has expired, and a refresh token is not available. Refresh tokens are not returned for responses that were auto-approved.

как обновить маркер и как с маркером получить токен обновления для обновления маркеров?

Стараюсь

  • В моем коде слишком $client = new Google_Client() но в обертке, в конструкторе.
  • я получить маркер доступа от HWIO пачке:

    hwi_oauth: 
    connect: 
        account_connector: app.provider.user_provider 
    firewall_name: secured_area 
    resource_owners: 
        google: 
         type:    google 
         client_id:   xxx.apps.googleusercontent.com 
         client_secret:  xxx 
         scope:    "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/drive" 
    

и после того, как я получаю маркер доступа я поставил его в БД. Затем в Action я создаю оболочку для google api (новый Google Client()) и устанавливаю для этого клиента мой токен доступа из БД. Как обновить токен доступа? Я стараюсь в действии использование функции Google API Lib setAccessType и setApprovalPrompt, но не ЭФФЕКТ

public function __construct(array $config, LoggerInterface $symfonyLogger = null) 
{ 
    // True if objects should be returned by the service classes. 
    // False if associative arrays should be returned (default behavior). 
    $config['use_objects'] = true; 
    $client = new \Google_Client($config); 
    if ($symfonyLogger) { 
     //BC for Google API 1.0 
     if (class_exists('\Google_Logger_Psr')) { 
      $googleLogger = new \Google_Logger_Psr($client, $symfonyLogger); 
      $client->setLogger($googleLogger); 
     } else { 
      $client->setLogger($symfonyLogger); 
     } 
    } 
    $client -> setApplicationName($config['application_name']); 
    $client -> setClientId($config['oauth2_client_id']); 
    $client -> setClientSecret($config['oauth2_client_secret']); 
    $client -> setRedirectUri($config['oauth2_redirect_uri']); 
    $client -> setDeveloperKey($config['developer_key']); 
    $client -> setAccessType ($config['access_type']); 
    $client -> setApprovalPrompt ($config['approval_prompt']); 

    $this -> client = $client; 
} 

конфигурации это:

happy_r_google_api: 
    application_name: carbon-quanta-137312 
    oauth2_client_id: xxxx.apps.googleusercontent.com 
    oauth2_client_secret: xxx 
    oauth2_redirect_uri: null 
    developer_key: null 
    site_name: aog.local.com 
    access_type: offline 
    approval_prompt: force 

и если в действии я устанавливаю на клиенте Google некоторые параметры, это же, если я добавить конструкторI, так что я делаю неправильно?

ответ

1

В приложении OAuth 2.0 protocol ваше приложение запрашивает авторизацию для доступа к ресурсам, идентифицируемым областями, и при условии, что пользователь аутентифицирован и одобрен, ваше приложение получает токены токена с краткосрочным доступом, которые позволяют ему обращаться к этим ресурсам и (необязательно) обновлять чтобы обеспечить долгосрочный доступ.

Идея обновления токенов заключается в том, что если токен доступа скомпрометирован, поскольку он недолговечен, у злоумышленника есть ограниченное окно, в котором его можно будет оскорбить.

Обновить токены, если они скомпрометированы, бесполезны, потому что злоумышленник требует идентификатор клиента и секрет в дополнение к токере обновления, чтобы получить токен доступа.

Причина, почему маркер может перестать работать:

  • Пользователь предоставил доступ.
  • Токен не использовался в течение шести месяцев.
  • Пользователь изменил пароли, а токен содержит области Gmail, Календарь, Контакты или Hangouts.
  • Учетная запись пользователя превысила определенное количество запросов токенов.

В настоящее время существует ограничение на 25 токенов обновления на одну учетную запись пользователя на одного клиента. Если предел достигнут, создание нового токена автоматически аннулирует старейший токен без предупреждения. Это ограничение не распространяется на service accounts.

Вот родственный SO билет обсудить, почему получение NULL фишку: Getting null Refresh token

+0

Я обновить мой вопрос, в моей компетенции трех параметров, и я в конструкторе обертке 'access_type: автономный approval_prompt: force' и до сих пор истек токенов обновления, как обновление или, может быть, проблема в пакете HWIO. Я получаю токен доступа от HWIO. Beacause У меня есть еще одна проблема с этой либой. Я загружаю файл на Google Drive, но имею файл emty и создаю функцию, но теперь теряю ее после восстановления проекта и установки композитора. Я думаю, что-то не так ( –

0

I understan. Я получаю маркер доступа от HWIO расслоения и добавить в конфигурационном HWIO расслоения access_type: автономная, approval_prompt: силу и в ответ у меня есть токен обновления не нулевого

google: 
     type:    google 
     client_id:   xxx 
     client_secret:  xxx 
     scope:    "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/drive" 
     options: 
      access_type:   offline 
      approval_prompt:  force 
8

refresh_token возвращается только по первому требованию. Когда вы обновляете токен доступа второй раз, он возвращает все, кроме refresh_token, а file_put_contents удаляет refresh_token, когда это происходит во второй раз.

Изменение кода, следующего за ним, будет слияние в исходном токене доступа с новым (см. Array_merge). Таким образом, вы сможете сохранить свой refresh_token для будущих запросов. Я опубликовал следующее исправление для Google, надеюсь, что в какой-то момент они его обновят.

See docs for more info

// Refresh the token if it's expired. 
    if ($client->isAccessTokenExpired()) { 
     $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); 
     $newAccessToken = $client->getAccessToken(); 
     $accessToken = array_merge($accessToken, $newAccessToken); 
     file_put_contents($credentialsPath, json_encode($accessToken)); 
    } 
0

Половина ответа уже ответил Arithran.

Истекший токен отправляется только в первый раз, когда вы авторизуете свою учетную запись. После этого вы больше не получите его, и поэтому вам нужно сохранить его с самого начала, а затем при каждом обновлении объединить старые и новые массивы.

Другая половина ответа заключается в том, как удалить и снова получить этот токен, иначе вам нужно будет каждый раз проверять новую учетную запись google.

  1. Перейти к настройкам безопасности вашей учетной записи: https://www.google.com/settings/u/1/security.
  2. Перейдите к разделу «Авторизация приложений и сайтов», затем нажмите «Просмотреть все».
  3. Затем «Отменить доступ» к вашему приложению.
  4. Сделайте новый запрос OAuth2. Это вернет refresh_token.

Не забудьте добавить access_type=offline вашему запросу