API de conexão com PassaporteWeb para aplicações Flask.
Os settings do Flask precisam conter as seguntes chaves:
PASSAPORTE_WEB
: dicionário contendo as chaves:HOST
: prefixo do PassaporteWeb, incluindo protocolo. Ex.:https://app.passaporteweb.com.br
.FETCH_USER_DATA_PATH
: path da URL de captura de dados do usuário. Ex.:/sso/fetchuserdata/
.REQUEST_TOKEN_PATH
: path da URL para inicialização da requisição de token. Ex.:/sso/initiate/
.ACCESS_TOKEN_PATH
: path da URL de troca de token. Ex.:/sso/token/
.AUTHORIZATION_PATH
: path da URL de autorização. Ex.:/sso/authorize/
.SCOPE
: escopo OAuth, padrão:auth:api
.CONSUMER_TOKEN
eCONSUMER_SECRET
: credenciais de autenticação do consumidor.ECOMMERCE_URL
(opcional): URL da aplicação no Ecommerce.
Flask-IdentityClient oferece o sinal
flask_identity_client.signal.update_service_account
, que precisa ser
conectado a um handler com assinatura (sender, user_data)
para
efetuar as atualizações do model equivalente a ServiceAccount
do
PassaporteWeb.
A lista de contas do usuário enviada pelo PassaporteWeb encontra-se na
chave accounts
de user_data
e pode ser modificada. Um lista com
os UUIDs das contas que permanecerem na chave após processamento dos
handlers será adicionada à chave accounts
do dicionário
user_data
na sessão, que contém outras chaves importantes, como
uuid
, email
, first_name
, last_name
e full_name
do
usuário (identity) autenticado.
O blueprint do Flask-IdentityClient pode ser encontrado em
flask_identity_client.application
e é chamado blueprint
.
Você pode registrá-lo:
from flask_identity_client.application import blueprint app.register_blueprint(blueprint, url_prefix='/sso')
Para registrar um outro blueprint para requerer usuário, você deve usar:
from flask_identity_client.startup_funcs import user_required # blueprint aqui é o blueprint alvo, não flask_identity_client! blueprint.before_request(user_required)
É possível obter recursos de um serviço atravessador através do factory
de funções startup flask_identity_client.startup_funcs.resources_from_middle
.
O factory recebe como parâmetro a chave do dicionário de configurações no config da aplicação. O dicionário deve ter as seguintes informações:
TOKEN
: token de acesso ao serviço atravessador.SECRET
: chave secreta associada ao token.HOST
: serviço atravessador, incluindo o protocolo (http://
ouhttps://
).PATH
: caminha na API do serviço atravessador que retorna os recursos.
O resultado é armazenado na sessão, referenciado pela chave resources
.
Caso ocorra algum erro, a chave existirá, mas o valor será None
.
O objeto de recursos na chave resources
da sessão possui os seguintes
atributos:
data
: dados recebidos.etag
: ETag da resposta, usado nas requisições seguintes.expires
: data de expiração da resposta da requisição em formato Posix, usado para evitar requisições múltiplas.
Observação: é preciso estar logado no PassaporteWeb, pois o serviço
atravessador receberá os mesmos dados do login. Caso os dados de
login estejam desatualizados ou o usuário não esteja logado, o valor
de resources
será werkzeug.exceptions.Unauthorized
(a exceção
não será levantada), delegando para a aplicação a responsabilidade
sobre como lidar com isso.
A sugestão é redirecionar o cliente para o processo de login:
if session['resources'] is Unauthorized: session.clear() return redirect(url_for('identity_client.login', next=request.url))
Até versão 0.4.2, a atualização era realizada passando para a biblioteca
o caminho para encontrar o model ServiceAccount
, na chave
SERVICE_ACCOUNT
dos settings.
A partir da versão 0.5, Flask-IdentityClient não precisa mais conhecer
detalhes de implementação da aplicação. Para atualizar a base local,
basta conectar um handler ao sinal
flask_identity_client.signal.update_service_account
, conforme
descrito acima.
Porém, é necessário atualizar o comportamento das aplicações antigas, que não serão mais compatíveis com as novas versões de Flask-IdentityClient.