Fluxo de autenticação¶
Resumo¶
login.phpredireciona paraauthorize_urldo SUAP comclient_ideredirect_uriapontando paraauthenticate.php.O usuário se autentica no SUAP e é redirecionado de volta com um parâmetro
code.authenticate.phptroca ocodepor umaccess_tokenemtoken_url.Com o
access_token, o plugin busca dados em quatro endpoints do SUAP e faz o merge dos resultados.create_or_update_user()cria ou atualiza o usuário no Moodle e sincroniza os campos de perfil.complete_user_login()autentica a sessão e o usuário é redirecionado ao destino original (next/wantsurl).
Endpoints do plugin¶
Endpoint |
Finalidade |
|---|---|
|
Inicia o login SUAP ( |
|
Callback OAuth2 ( |
|
Página de confirmação de logout completo (SUAP + Moodle). |
|
Diagnóstico: exibe configurações ativas (requer login). |
|
Redireciona para |
Note
Versões anteriores deste README documentavam um endpoint adicional, dispatch.php, que
geraria um token de webservice do Moodle a partir de um header Authentication: Token
(para uso por aplicativos). Esse arquivo não existe mais no código-fonte atual —
foi removido em uma refatoração anterior. Esta documentação descreve apenas o que está
implementado hoje.
Passo 1 — login()¶
auth_plugin_suap::login() (em auth.php):
Resolve o destino pós-login (
next): parâmetronext, ou$SESSION->wantsurl, ou a raiz do site.Se o usuário já está logado, apenas redireciona para
next.Caso contrário, valida que
authorize_urleclient_idestão configurados (senão lançaconfigincomplete), guardanextem$SESSION->next_after_nexte redireciona para:{authorize_url}?response_type=code&client_id={client_id}&redirect_uri={wwwroot}/auth/suap/authenticate.php
Passo 2 — troca do código por token¶
authenticate_token() faz um POST para token_url com grant_type=authorization_code,
code, redirect_uri, client_id e client_secret. Em caso de erro (resposta sem
access_token, erro de cURL ou HTTP ≥ 400), a exceção é capturada e o plugin renderiza o
template auth_suap/auth_error com um botão para reiniciar o login, em vez de expor o
erro bruto ao usuário.
Se bem-sucedida, o método retorna os headers usados nas chamadas seguintes:
Authorization: Bearer {access_token}
x-api-key: {client_secret}
Accept: application/json
Passo 3 — coleta de dados do usuário¶
authenticate() chama, em sequência, quatro métodos que consultam a API do SUAP e cujos
resultados são combinados com array_merge (nesta ordem: rheu, meusdados,
ensinomeusdadosaluno, meusvinculos — chaves posteriores sobrescrevem as anteriores):
Método |
Endpoint (configurável) |
Observações |
|---|---|---|
|
|
Chamado com |
|
|
Remove o campo |
|
|
Retorna |
|
|
Tolerante a falhas: qualquer exceção (ex.: usuário não é aluno) é capturada e o
método retorna um objeto vazio, sem interromper o login. Remove
|
Passo 4 — criação/atualização do usuário¶
Ver Sincronização de usuário para a tabela completa de campos. Em resumo,
create_or_update_user():
Deriva o
usernamedeidentificacao(oumatriculacomo fallback), em minúsculas; lançaidentificacao_ausentese nenhum dos dois estiver presente.Se o usuário não existir, cria a conta com uma senha aleatória local (ignorada, pois a autenticação é sempre via
suap) e, selocal_suapestiver instalado, aplicadefault_user_preferences.Em toda autenticação (criação ou login subsequente), atualiza nome, e-mail e dezenas de campos de perfil customizados a partir dos dados do SUAP.
Persiste as alterações via
update_user_record()(herdado deauth_oauth2\auth).Se houver URL de foto disponível, baixa e aplica via
update_picture().
Passo 5 — conclusão do login¶
complete_user_login($usuario) autentica a sessão Moodle. Em seguida,
resolve_next_after_login() recupera e limpa $SESSION->next_after_next (definido no
passo 1) para determinar o destino do redirecionamento, com fallback para a raiz do site caso
nada tenha sido salvo.
Logout¶
postlogout_hook() intercepta o logout de usuários com auth == 'suap' e redireciona
para /auth/suap/logout.php, que exibe uma página de confirmação: o usuário escolhe entre
encerrar também a sessão no SUAP (logout_url) ou permanecer conectado ao Moodle.
\core\session\manager::init_empty_session() é chamado antes de exibir a página, para já
invalidar a sessão Moodle local.