Ссылка на аккаунт успешно, но маркер доступа показывает недействительным - Google OAuth - PullRequest
0 голосов
/ 23 октября 2018

Я пытался внедрить службу Google OAuth с неявным потоком для привязки моей учетной записи Dialogflow (используя эту документацию )

Я разработал код в соответствии с этим документом.Он отлично работает, когда пользователь связывает свою учетную запись и показывает: «Вы успешно связали свою учетную запись с чатботом».

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

Вот мой код, с помощью которого я его реализовал

import os
import flask
from flask import request, redirect
import string
import random
from random import choice, randint
import google_auth_oauthlib.flow
from AES import AESCipher
import json

CLIENT_SECRETS_FILE = "client_secret.json"

SCOPES = ['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email']
app = flask.Flask(__name__)
app.secret_key = 'SECRET_KEY'

#
# Actions on google call this function with client_id, redirect_uri, state, and response_type
#
@app.route('/auth')
def authorize():
    flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
        CLIENT_SECRETS_FILE, scopes=SCOPES)

    flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

    print ("%%%%STATE", request.args["state"])
    authorization_url, state = flow.authorization_url(
        access_type='offline',
        include_granted_scopes='true')

    flask.session['state'] = request.args["state"]
    print ("IN AUTH STATE ", state)

    return flask.redirect(authorization_url)


def get_user_id():
    min_char = 8
    max_char = 12
    allchar = string.ascii_letters + string.punctuation + string.digits
    password = "".join(choice(allchar) for x in range(randint(min_char, max_char)))
    return password


@app.route('/oauth2callback')
def oauth2callback():
    print ("### IN CALLBACK ###", request)
    state = flask.session['state']

    user_id = get_user_id()
    client_id = ''.join(random.sample("Google", len("Google")))
    key = ''.join(random.sample("JayPatel", len("JayPatel")))
    bytes_obj = {
        'user_id': user_id,
        'client_id': client_id
    }
    access_token = AESCipher("Jay").encrypt(json.dumps(bytes_obj))
    access_token = access_token.replace('+', 'p')
    access_token = access_token.replace('&', '1')

    # My generated access_token looks like 
    # 6u2PeFcUtNmAblw5N3YAKSn7EC46xQVmgv3Rc8XK9sTW4xcgAxw1doRsvmgE/CC2qGUJ1x7XpNpdYvGes6qJHIEQSwvgEJt8hnYEUbm0qEA=
    print ("###### Access Token ", access_token)
    print ("###### State ", state)

    url = "https://oauth-redirect.googleusercontent.com/r/test-happierbot-4c514#access_token=" + access_token + "&token_type=bearer&state=" + state

    return redirect(url)


if __name__ == '__main__':
    os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'

    app.run('localhost', 8080, debug=True)

Когда я пытаюсь получить информацию используя access_token от https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=my_generated_token API, он дает

{
    "error": "invalid_token",
    "error_description": "Invalid Value"
}

Есть ли какой-либо другой процесс для активации access_token или я пропустил какой-либо шаг?

1 Ответ

0 голосов
/ 23 октября 2018

Если я правильно следую коду, вы генерируете свой собственный токен доступа, чтобы вернуться к пользователю, а затем используете конечную точку Google tokeninfo, чтобы проверить, действителен ли токен?

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

Ожидается, что ваша служба определит ее действительность на основе любых средств, которые вы захотите (найдите ее в таблице, выполните обратный процесс для расшифровкии проверьте это, проверьте правильность подписи и т. д.).Поскольку Google ничего не знает о токене, он не может определить, действительно ли он действителен.

Сервис tokeninfo возвращает информацию о токенах , которые Google сгенерировал .

Google не позволяет вам использовать их конечную точку токена для привязки аккаунта OAuth.Вместо этого вы можете использовать Google Sign In for Assistant , и это даст вам маркер идентификатора.Вы можете использовать это вместе с обычным входом в Google через веб-сайт, чтобы получить токен доступа и токен обновления , который можно использовать для получения доступа к ресурсам Google пользователя с их разрешения.(См. этот ответ переполнения стека для более подробной информации.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...