2015-01-21 4 views
2

Я работаю в небольшой компании, чья почта размещена через Google. Как один из администраторов, ответственных за управление учетными записями сотрудников, я пытаюсь автоматизировать некоторые задачи с помощью API Google и одной или нескольких специализированных учетных записей служб. Я написал короткий сценарий Python ниже, чтобы запросить токен доступа в соответствии с документацией Google, но я продолжаю получать ошибку «invalid_grant».Ошибка Python OAuth «Недопустимый грант»

Я сделал следующее:

  • Записан в консоль разработчика Google в качестве учетной записи службы и создал проект
  • Создано идентификатор клиента учетной записи типа службы
  • Записан в Google администратор Консоль и добавленные адреса электронной почты и URL-адреса клиента. Я хочу, чтобы учетная запись имела доступ к
  • . .
. . .

. Поиск в Интернете дал ответы, указав, что либо система ti я выключен, предел для токенов обновления превышен или что вместо идентификатора клиента используется идентификатор клиента. Я синхронизировал время на машине Windows и машине Linux до запуска скрипта и появляется такая же ошибка. Я даже не получаю токен доступа, поэтому я сомневаюсь, что предел обновления превышен. Как видно ниже, значение iss устанавливается на адрес электронной почты клиента, заканчивающийся на «@ developer.gserviceaccount.com».

Я подозреваю, что есть что-то еще, что мне не хватает, и, поскольку я новичок в Python, я подозреваю, что это что-то неловко просто. Может быть, кто-то может помочь?

import json 
import time 
import base64 
import requests 
from datetime import datetime 

utc = datetime.utcnow() 
iat = time.mktime(utc.timetuple()) 
exp = iat + 3600 

jwt_header = { 
    "alg":"RS256", 
    "typ":"JWT" 
} 

jwt_claim_set = { 
    "iss":"[email protected]", 
    "scope":"https://www.googleapis.com/auth/admin.directory.user", 
    "aud":"https://www.googleapis.com/oauth2/v3/token", 
    "iat":int(iat), 
    "exp":int(exp), 
    "sub":"[email protected]" 
} 

jwt_jws = bytearray(str(jwt_header) + '.' + str(jwt_claim_set)) 

jwt_unencoded = str(jwt_header) + '.' + str(jwt_claim_set) + '.' +  str(jwt_jws) 
jwt_encoded = base64.urlsafe_b64encode(str(jwt_unencoded)) 

url = 'https://www.googleapis.com/oauth2/v3/token' 
headers = { 
    'content-type': 'application/x-www-form-urlencoded' 
} 

payload = { 
    'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer', 
    'assertion': jwt_encoded 
} 

response = requests.post(url, headers=headers, params=payload) 

print response 
print response.json() 

Выход следующий:

<Response [400]> 
{u'error_description': u'Bad Request', u'error': u'invalid_grant'} 
+0

Я думаю, что грант должен быть authorization_code или что-то подобное здесь. https://developers.google.com/accounts/docs/OAuth2WebServer#offline Видя, что ваш grant_type является 'grant_type': 'urn: ietf: params: oauth: grant-type: jwt-bearer', поэтому с ошибкой –

+0

Спасибо за быстрый ответ. Однако предложение и сопутствующая ссылка, включенные в ваш ответ, предназначены для запросов доступа от приложений веб-сервера, а не для учетных записей служб. Выполнение предложенных изменений приводит к тому, что скрипт выдает другую ошибку, которая указывает '{u'error_description ': u'Missing требуемый параметр: code', u'error ': u'invalid_request'}' – r3tic3nc3

+0

Сообщение об ошибке было результатом меня используя 'params' вместо' data'. Первое должно использоваться с запросами на получение, в то время как последнее должно использоваться с почтой. Однако теперь я получаю сообщение об ошибке, в котором говорится: '' u'error_description ': отсутствует u'Required параметр: grant_type', u'error ': u'invalid_request'} '. – r3tic3nc3

ответ

0

Я хотел бы посмотреть на выходе HTTP и URL, чтобы убедиться, но это не кажется, что у вас возникли проблемы аутентификации.

Я столкнулся с аналогичной, хотя и менее сложной проблемой, и не смог получить учетные данные своего разработчика Google через скрипт python. Я в конечном итоге, используя мои куки браузера Chrome с помощью этого сценария, чтобы получить через ту часть: http://n8henrie.com/2014/05/decrypt-chrome-cookies-with-python/

делает все довольно просто:

url = 'http://www.example.com' 
s = requests.Session() 
cookies = pyCookieCheat.chrome_cookies(url) 
s.get(url, cookies = cookies) 
+0

Спасибо за предложение и полезную информацию. Однако я не думаю, что это жизнеспособное решение для этого конкретного сценария. Учетная запись, которая будет использоваться для этого, - это учетная запись службы, и вполне возможно, что будущие учетные записи службы.Необходимость входа на сайт Google с каждым для создания зашифрованного файла cookie, который затем необходимо будет расшифровать, не является практичным или масштабируемым. Если Google изменяет свои файлы cookie, поскольку автор на этой странице упоминает, что это вдохновляет его сценарий, это нужно будет сделать снова. – r3tic3nc3

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