flask-oidc - токен необходим, но недействителен - с помощью Google sso - PullRequest
0 голосов
/ 06 декабря 2018

edit Я только что понял, насколько глупый мой вопрос.Google не авторизует таким образом.Мне нужно внедрить собственную службу авторизации и спросить у него.Keycloak уже реализует этот способ

Я пытаюсь получить доступ к ресурсам, которые защищены уровнем авторизации.Я на самом деле использую пример кода колба-OIDC.Я могу хорошо аутентифицироваться из своей учетной записи Google, но не могу получить доступ к своей конечной точке API, поскольку токен считается недействительным.

Я думаю, что проблема связана с json client_secrets, но я не уверен, так какпри отладке параметр «flask-oicd» является непрозрачным.

client_secrets.json

    {
  "web": {
    "client_id": "xxxxx",
    "client_secret": "xxxxxxx",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "userinfo_uri": "https://www.googleapis.com/oauth2/v1/userinfo?alt=json",
    "redirect_uris": [
      "http://127.0.0.1:5000/oidc_callback"
    ]
  }
}

А вот мой код, который аналогичен примеру с несколькимимодификации:

app.py

import json
import logging

from flask import Flask, g
from flask_oidc import OpenIDConnect

logging.basicConfig(level=logging.DEBUG)

app = Flask(__name__)
app.config.update({
    'SECRET_KEY': 'SomethingNotEntirelySecret',
    'TESTING': True,
    'DEBUG': True,
    'OIDC_CLIENT_SECRETS': 'client_secrets.json',
    'OIDC_INTROSPECTION_AUTH_METHOD': 'client_secret_post',
    'OIDC_TOKEN_TYPE_HINT': 'access_token',
    'OIDC_ID_TOKEN_COOKIE_SECURE': False,
    'OIDC_REQUIRE_VERIFIED_EMAIL': False
})


oidc = OpenIDConnect(app)

@app.route('/')
def hello_world():
    if oidc.user_loggedin:
        return ('Hello, %s, <a href="/private">See private</a> '
                '<a href="/logout">Log out</a>') % \
            oidc.user_getfield('email')
    else:
        return 'Welcome anonymous, <a href="/private">Log in</a>'


@app.route('/private')
@oidc.require_login
def hello_me():
    info = oidc.user_getinfo(['email', 'openid_id'])
    return ('Hello, %s (%s)! <a href="/">Return</a>' %
            (info.get('email'), info.get('openid_id')))

@app.route('/api')
@oidc.accept_token(True, ['openid'])
def hello_api():
    return json.dumps({'hello': 'Welcome %s' % g.oidc_token_info['sub']})


@app.route('/logout')
def logout():
    oidc.logout()
    return 'Hi, you have been logged out! <a href="/">Return</a>'

Так что я могу войти, но не могу получить доступ по адресу:

@app.route('/api')
@oidc.accept_token(True, ['openid'])
def hello_api():

, где я получаюan:

{"error": "invalid_token", "error_description": "Token required but invalid"}

В документе написано:

 accept_token(require_token=False, scopes_required=None, render_errors=True)

    Use this to decorate view functions that should accept OAuth2 tokens, this will most likely apply to API functions.

    Tokens are accepted as part of the query URL (access_token value) or a POST form value (access_token).

    Note that this only works if a token introspection url is configured, as that URL will be queried for the validity and scopes of a token.

Две мои проблемы:

  • этот URL-адрес самоанализа токена нигде не описан в документе.Это то же самое, что token_uri?
  • Я не могу отладить и вижу только 401 из колбы.Это не помогает мне понять, что он сделал.Есть ли способ узнать, что называется oicd в фоновом режиме?

Заранее спасибо.

...