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 в фоновом режиме?
Заранее спасибо.