Конечная точка облака oauth2 ошибка
Я только недавно смог провести рефакторинг своего приложения механизма приложений для поддержки облачных конечных точек после просмотра полезных эпизодов GDL для IMO на YouTube.
Я тестирую свой сайт, используя клиент javascript для обработки авторизации, а затем возвращаю список элементов, которые в основном работают. Но когда я вызываю конечную точку, чтобы вернуть список элементов, я получаю этот набор ошибок в моих журналах App Engine:
I 2013-03-14 08:52:14.748 Checking for id_token.
W 2013-03-14 08:52:14.748 id_token verification failed: Wrong number of segments in token: ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE
I 2013-03-14 08:52:14.748 Checking for oauth token.
W 2013-03-14 08:52:14.885 Found 1 RPC request(s) without matching response (presumably due to timeouts or other errors)
Из того, что я могу сказать, есть только 2 "сегмента" во всех токенах аутентификации, которые гугл возвращает не 3, так что мне не ясно, что это значит.
Вот заголовок запроса авторизации из консоли моего браузера: Авторизационный канал ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE
Любая помощь будет оценена.
1 ответ
Существует два типа токенов: идентификационные токены и стандартные токены на предъявителя.
Токен на предъявителя:
Это стандартный токен, полученный с помощью танца OAuth.
Идентификационный токен:
Типичный идентификационный токен будет выглядеть примерно такeyJhbGciOiJSUzI1NiIsImtpZCI6IjIxZWFlMTVkODE.eyJpc3MiOiJhY2NvdW50cy5n.oXLawgz_ed
(за исключением сегментов, которые намного длиннее) и является подписанным JWT.
Идентификационный токен можно получить в JavaScript, добавив 'id_token'
к типу ответа, как это сделано в нашем образце Tic-Tac-Toe.
Таким образом, токен, возвращаемый из запроса OAuth, также будет иметь идентификатор токена:
var token = gapi.auth.getToken();
// Use id_token instead of bearer token
token.access_token = token.id_token;
Что вы видите в журналах:
Линия
W 2013-03-14 08:52:14.748 id_token verification failed: Wrong number of segments in token: ya29.AHES6ZSpbeiTPTOJhCTtRdypgldcrRBQBKH8oQ8Y_FpxG5-Lr3OW6dE
это только предупреждение, означающее, что наблюдаемый токен ya29.AHE...
это не ID токен, а следующая строка в журнале
I 2013-03-14 08:52:14.748 Checking for oauth token.
означает, что он движется дальше, чтобы проверить, является ли токен токеном на предъявителя.
Это НЕ означает, что ваш токен был недействительным, просто он проверял токен на предъявителя.
Линия
W 2013-03-14 08:52:14.885 Found 1 RPC request(s) without matching response (presumably due to timeouts or other errors)
вероятно означает, что был RPC, чтобы проверить токен, который потерпел неудачу. Основными элементами для проверки токена на предъявителя являются призыв к
oauth.get_current_user(EMAIL_SCOPE)
и просьба к
https://www.googleapis.com/oauth2/v2/tokeninfo?access_token=ya29.AHE...
проверить идентификатор клиента и аудиторию на токене.
Идентификационный токен в глубину:
Первый сегмент представляет собой закодированное в base64url описание используемого шифрования. Например.
>>> import base64, json
>>> segments = id_token.split('.')
>>> first_segment = segments[0] + '=' * ((4 - len(segments[0])) % 4)
>>> json.loads(base64.urlsafe_b64decode(first_segment))
{u'alg': u'RS256', u'kid': u'21eae15d817c1b4a8f6ff4501930512d07cbe684'}
второй сегмент представляет собой расшифровку содержимого токена в кодировке base64url:
>>> second_segment = segments[1] + '=' * ((4 - len(segments[0])) % 4)
>>> base64.urlsafe_b64decode(second_segment)
{u'at_hash': u'xxxyyyzzz', # Fake Data
u'aud': u'someclient_id.apps.googleusercontent.com',
u'azp': u'someclient_id.apps.googleusercontent.com',
u'cid': u'someclient_id.apps.googleusercontent.com',
u'email': u'joe@mail.com',
u'email_verified': u'true',
u'exp': 1363289943,
u'hd': u'google.com',
u'iat': 1363286043,
u'id': u'123456789', # Fake Data
u'iss': u'accounts.google.com',
u'sub': u'123456789', # Fake Data
u'token_hash': u'xxxyyyzzz', # Fake Data
u'verified_email': u'true'}
и третий сегмент представляет собой комбинацию первых двух, подписанных закрытым ключом Google.