Guia: Python
Passo 1: Extraia o Token Bearer do cabeçalho da solicitação
Uma solicitação autorizada deve conter um cabeçalho Authorization
com Bearer <access_token>
como seu conteúdo. Extraia o Token de Autorização do cabeçalho da solicitação:
"""requires-auth.py
"""
def get_auth_token():
auth = request.headers.get("Authorization", None)
if not auth:
raise Error({ code: 'auth.authorization_header_missing', status: 401 })
contents = auth.split()
if len(contents) < 2:
raise Error({code: 'auth.authorization_token_invalid_format', status: 401})
elif contents[0] != 'Bearer':
raise Error({code: 'auth.authorization_token_type_not_supported', status: 401})
return contents[1]
Passo 2: Validação do token
Para demonstração, usamos o aplicativo Flask e o pacote jose para criar o decorador require_auth para validar a assinatura do token, status de expiração e reivindicações necessárias.
Instale python-jose
como sua dependência
Escolha a criptografia que você está usando no Logto. (ecdsa
por padrão)
pip install python-jose[ecdsa]
Recupere as configurações OIDC do Logto
Você precisará de um conjunto de chaves públicas JWK e do emissor do token para verificar a assinatura e a origem do token JWS recebido. Todas as últimas Configurações de Autorização Pública do Logto podem ser encontradas em https://<your-logto-domain>/oidc/.well-known/openid-configuration
.
Por exemplo, chame https://tenant-id.logto.app/oidc/.well-known/openid-configuration
. E localize os seguintes dois campos no corpo da resposta:
{
"jwks_uri": "https://tenant-id.logto.app/oidc/jwks",
"issuer": "https://tenant-id.logto.app/oidc"
}
Crie o decorador de validação de autorização
Se você usar controle de acesso baseado em papel (RBAC), a validação de escopo também é necessária.
"""requires-auth.py
"""
import json
from flask import request, _request_ctx_stack
from six.moves.urllib.request import urlopen
from functools import wraps
from jose import jwt
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
token = get_token_auth_header()
# endpoint jwks_uri recuperado do Logto
jwks_uri = urlopen('https://<your-logto-domain>/oidc/jwks')
# emissor recuperado do Logto
issuer = 'https://<your-logto-domain>/oidc'
jwks = json.loads(jwks_uri.read())
try:
payload = jwt.decode(
token,
jwks,
# O algoritmo de codificação jwt recuperado junto com jwks. ES384 por padrão
algorithms=jwt.get_unverified_header(token).get('alg'),
# O indicador de recurso registrado da API no Logto
audience='<your request listener resource indicator>',
issuer=issuer,
options={
'verify_at_hash': False
}
)
except Exception:
# manipulador de exceção
raise Error({code: 'invalid_token', status: 401})
# Código personalizado para processar payload
_request_ctx_stack.top.user_id = payload.get('sub')
return f(*args, **kwargs)
return decorated
Aplique o decorador à sua API
from flask import Flask
from flask_cors import cross_origin
APP = Flask(__name__)
@APP.route("/user/info")
@cross_origin(headers=["Content-Type", "Authorization"])
@requires_auth
def api:
# Sua lógica de API