Як я можу перевірити маркер доступу API аутентифікації Google?


134

Як я можу перевірити маркер доступу до аутентифікації Google?

Мені потрібно якось запитати Google і запитати: чи дійсний [заданий маркер доступу] для облікового запису [example@example.com] Google?

Коротка версія :
Зрозуміло, як маркер доступу, що надається через аутентифікацію Google Api :: OAuth Authentication для веб-додатків, може використовуватися для запиту даних із ряду служб Google. Не зрозуміло, як перевірити, чи вказаний маркер доступу дійсний для даного облікового запису Google. Я хотів би знати як.

Довга версія :
я розробляю API, який використовує аутентифікацію на основі лексем. Маркер буде повернутий при наданні дійсного імені користувача + пароля або при наданні стороннього маркера з будь-якої з N перевірених послуг.

Однією із сторонніх служб буде Google, яка дозволяє користувачеві пройти автентифікацію проти моєї служби за допомогою свого облікового запису Google. Пізніше це буде розширено, щоб включати облікові записи Yahoo, надійних постачальників OpenID тощо.

Схематичний приклад доступу на базі Google:

alt текст http://webignition.net/images/figures/auth_figure002.png

Сутність "API" знаходиться під моїм повним контролем. Суб'єктом "загальнодоступний інтерфейс" є будь-який додаток на веб-або настільному ПК. Деякі загальнодоступні інтерфейси знаходяться під моїм контролем, інші не будуть, а інші ще я, можливо, ніколи навіть про це не знаю.

Тому я не можу довіряти маркер, наданий API на кроці 3. Це буде надано разом із відповідною електронною адресою облікового запису Google.

Мені потрібно якось запитати Google і запитати: чи дійсний маркер доступу for example@example.com ?

У цьому випадку example@example.com - це унікальний ідентифікатор облікового запису Google - адреса електронної пошти, яку хтось використовує для входу в свій обліковий запис Google. Це не можна вважати адресою Gmail - хтось може мати обліковий запис Google, не маючи облікового запису Gmail.

У документації Google чітко зазначено, як за допомогою маркера доступу можна отримати дані з ряду служб Google. Здається, ніщо не вказує, як можна перевірити, чи вказаний маркер доступу в першу чергу дійсний.

Оновлення Маркер дійсний для N служб Google. Я не можу спробувати маркер проти служби Google як засобу її перевірки, оскільки я не буду знати, який підмножина всіх служб Google фактично використовує даний користувач.

Крім того, я ніколи не буду використовувати маркер доступу до аутентифікації Google для доступу до будь-яких служб Google, а лише як засіб перевірки передбачуваного користувача Google - це те, про кого вони кажуть. Якщо є інший спосіб зробити це, я радий спробувати.


Про яку саме службу аутентифікації йдеться про це питання (OAuth, AuthSub, встановлені програми, ...)? Надайте більш детальне посилання.
Мартін проти Левіса

@Martin v. Löwis: Служба "Автентифікація OAuth для веб-додатків" - я оновив початок питання, щоб відобразити це. Дякуємо, що вказали на це!
Джон Крам

цікава стаття про перевірку ключів google може дати більше
огляду груп.google.com/

Відповіді:


138

Для перевірки користувача просто опублікуйте маркер доступу як accessToken та опублікуйте його та отримайте відповідь

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken

ви можете спробувати і в адресному рядку в браузерах, також використовувати httppost та відповідь у java

відповідь буде як

{
     "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
     "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
     "expires_in": 3340,
     "access_type": "offline"
    }

Область застосування - це даний дозвіл accessToken. ви можете перевірити ідентифікатори обсягу за цим посиланням

Оновлення: Нова публікація API, як показано нижче

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

Відповідь буде такою

 {
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

Для отримання додаткової інформації https://developers.google.com/identity/sign-in/android/backend-auth


11
Існує новіша версія для google's oauth2 - v3. Дивіться приклад тут: developers.google.com/identity/sign-in/android/backend-auth
AlikElzin-kilaka

30

ви можете перевірити маркер доступу до аутентифікації Google, використовуючи цю кінцеву точку:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>

Це кінцева точка валідації OAuth AccessToken Google V3, ви можете посилатися з google документа нижче: (На OAUTH 2.0 ENDPOINTSвкладці)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token


Для документації на Backend - джерело документації знаходиться тут
eton_ceb

26

Гаразд, більшість відповідей справедливі, але не зовсім правильні. Ідея JWT полягає в тому, що ви можете перевірити маркер без необхідності щоразу звертатися до емітента. Ви повинні перевірити ідентифікатор і перевірити підпис токена відомим відкритим ключем google-сертифіката, який використовується для підпису маркера.

Дивіться наступний пост, чому і як це зробити.

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/


3
Більше оновлень, будь ласка! The idea of JWT is that you can validate the token without the need to contact the issuer everytime.
Моріц Шмітц проти Хюльста

так! ppl є ddos-ing google, якщо вони просто зателефонують у Google за інформацією маркера
datdinhquoc

Ви не можете це зробити з маркерами доступу Google, оскільки вони не є JWT. Перевірте stackoverflow.com/questions/48623656/…
DanielJaramillo

18
function authenticate_google_OAuthtoken($user_id)
{
    $access_token   = google_get_user_token($user_id); // get existing token from DB
    $redirecturl    = $Google_Permissions->redirecturl;
    $client_id      = $Google_Permissions->client_id;
    $client_secret  = $Google_Permissions->client_secret;
    $redirect_uri   = $Google_Permissions->redirect_uri;
    $max_results    = $Google_Permissions->max_results;

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token;
    $response_contacts  =  curl_get_responce_contents($url);
    $response   =   (json_decode($response_contacts));

    if(isset($response->issued_to))
    {
        return true;
    }
    else if(isset($response->error))
    {
        return false;
    }
}

2
Ця відповідь майже досі справедлива. Здається, Issued_to більше не встановлюється. developers.google.com/accounts/docs/…
frostymarvelous

6

Відповідь на потік коду Google oauth на додаток access_tokenтакож повертаєтьсяid_token що містить корисну для інформації перевірки в зашифрованому вигляді.

Одне з корисних токенів ідентифікаторів - це той факт, що ви можете передавати їх навколо різних компонентів програми. Ці компоненти можуть використовувати маркер ідентифікатора як легкий механізм аутентифікації, що засвідчує додаток та користувача. Але перш ніж використовувати інформацію в токені ID або покластися на неї як твердження про те, що користувач перевірив автентифікацію, необхідно перевірити її.

Перевірка маркера ідентифікатора потребує декількох кроків:

  • Переконайтеся, що маркер ID - це JWT, який належним чином підписаний відповідним відкритим ключем Google.
  • Переконайтеся, що значення аудиту в маркері ідентифікатора дорівнює ідентифікатору клієнта вашого додатка.
  • Переконайтеся, що значення iss у маркері ідентифікатора дорівнює account.google.com або https://accounts.google.com .
  • Перевірте, чи не минув час закінчення (exp) маркера ідентифікатора.
  • Якщо ви передали параметр hd у запиті, переконайтеся, що у маркера ідентифікатора є HD-запит, який відповідає вашому домену, розміщеному Google Apps.

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken посилання містить зразки коду для перевірки маркерів ID.

Дивіться також /security/37818/why-use-openid-connect-instead-of-plain-oauth .


1

Мені потрібно якось запитати Google і запитати: чи дійсний маркер доступу for example@example.com?

Ні. Все, що вам потрібно, - це запит стандартного входу за допомогою Federated Login для користувачів облікового запису Google з вашого домену API. І лише після цього ви можете порівняти "постійний ідентифікатор користувача" з таким, який ви маєте, з "загальнодоступного інтерфейсу".

Значення області використовується на сторінці Федерального входу в Google, щоб ідентифікувати запитуючий сайт для користувача. Він також використовується для визначення значення постійного ідентифікатора користувача, поверненого Google.

Тому вам потрібно бути з того самого домену, що і "загальнодоступний інтерфейс".

І не забувайте, що користувач повинен бути впевнений, що вашому API можна довіряти;) Тому Google запитає користувача, чи дозволяє він перевірити його особу.


1

Ось приклад використання Guzzle :

/**
 * @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token
 * @return array|false False if token is invalid or array in the form
 * 
 * array (
 *   'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'scope' => 'https://www.googleapis.com/auth/calendar',
 *   'expires_in' => 3350,
 *   'access_type' => 'offline',
 * )
 */
public static function tokenInfo($accessToken) {
    if(!strlen($accessToken)) {
        return false;
    }

    if($accessToken[0] === '{') {
        $accessToken = json_decode($accessToken)->access_token;
    }

    $guzzle = new \GuzzleHttp\Client();

    try {
        $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
            'query' => ['access_token' => $accessToken],
        ]);
    } catch(ClientException $ex) {
        return false;
    }

    return $resp->json();
}

0

Спробуйте зробити запит на аутентифікацію OAuth за допомогою маркера на https://www.google.com/accounts/AuthSubTokenInfo . Це лише документально підтверджено для роботи на AuthSub, але це працює і для OAuth. Він не скаже вам, для кого призначений маркер, але він підкаже, для яких служб він дійсний, і запит не вдасться, якщо маркер недійсний або відкликаний.


0

Довільний маркер доступу до OAuth не може використовуватися для аутентифікації, оскільки значення маркера знаходиться поза специфікацією Core OAuth. Він може бути призначений для одноразового використання або вузького терміну придатності, або може надавати доступ, який користувач не хоче надати. Це також непрозоро, і споживач OAuth, який його отримав, ніколи не бачив жодного типу ідентифікатора користувача.

Постачальник послуг OAuth та один або більше споживачів могли б легко використовувати OAuth для надання маркера автентифікації, який можна перевірити, і є пропозиції та ідеї, як це зробити там, але довільний постачальник послуг, що говорить лише OAuth Core, не може надати це без іншого спільного погодження зі споживачем. Метод AuthSubTokenInfo REST, визначений Google, поряд з ідентифікатором користувача є близьким, але він також не підходить, оскільки міг би визначити марку недійсною, або маркер міг бути закінчений.

Якщо ваш ідентифікатор Google є ідентифікатором OpenId, а ваш "загальнодоступний інтерфейс" - це або веб-додаток, або ви можете зателефонувати в браузер користувача, тоді, ймовірно, слід використовувати OpenID OP Google.

OpenID полягає в тому, щоб просто відправити користувача в ОП і отримати назад підписане твердження. Взаємодія виключно на користь RP. Не існує довгоживучого маркера або іншої спеціальної для користувача ручки, яка могла б бути використана для вказівки на те, що RP успішно провів аутентифікацію користувача з ОП.

Один із способів перевірити попередню автентифікацію проти ідентифікатора OpenID - це просто виконати автентифікацію ще раз, припускаючи, що використовується той самий агент-користувач. ОП повинна мати можливість повернути позитивне твердження без взаємодії з користувачем (наприклад, підтверджуючи файл cookie чи клієнт). ОП може вимагати іншої взаємодії з користувачем, і, ймовірно, буде, якщо запит на автентифікацію надходить з іншого домену (мій ОП дає мені можливість повторно аутентифікувати цю конкретну RP без взаємодії в майбутньому). І у випадку Google, інтерфейс користувача, через який користувач пройшов, щоб отримати маркер OAuth, може не використовувати той самий ідентифікатор сеансу, тож користувачеві доведеться повторно пройти автентифікацію. Але в будь-якому випадку ви зможете стверджувати особу.


Google OpenID 2.0 була остаточно відхилена та відключена на користь базованого на OAuth OpenID Connect, який забезпечує перевірені маркери ідентифікаторів .
Вадим
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.