Como ainda estava começando a entender seu funcionamento, cometi alguns erros, nada muito esdrúxulo ou que atrapalhe seu entendimento posterior.
Bem, agora, depois de duas semanas estudando sobre o funcionamento de um consumidor, vou explicar aqui um pouco do que descobri.
Numa transação de autenticação OpenID, há pelo menos três nós envolvidos: cliente, consumidor (RP, relying party) e provedor (OP, provider).
O cliente é o usuário que quer se autenticar, geralmente com seu navegador.
O consumidor é o sistema onde o cliente quer se autenticar.
O provedor é o serviço OpenID onde o cliente se cadastrou.
A autenticação então funciona mais ou menos assim:
- o cliente acessa o consumidor e informa sua URL de identificação;
- o consumidor «canonicaliza» a URL, e procura saber qual a identificação verdadeira (IDP) e quem é o provedor;
- o consumidor toma quaisquer medidas necessárias para verificar a identificação e redireciona o cliente para o provedor;
- cliente e provedor se entendem e, a partir daí, a conexão volta para o consumidor;
- a partir dos dados voltados, o consumidor sabe se o cliente está autorizado ou não.
Alternativamente o provedor pode enviar dados extra sobre o cliente, em formato SRE (ou
sreg
) ou AX.Há dois modos de transação entre consumidor e provedor: dumb mode e smart mode.
Dumb mode
O dumb mode é usado quando o consumidor não suporta cálculos de criptografia.
Primeiro o cliente informa sua URL e o consumidor a usa para descobrir qual sua identificação e quem é o provedor. Na versão 1.0 esses dados se encontram nas seguintes tags:
<link rel="openid.delegate" href="identidade" />
<link rel="openid.server" href="provedor" />
Na versão 2.0:
<link rel="openid2.local_id" href="identidade" />
<link rel="openid2.provider" href="provedor" />
É interessante verificar todos.
Obtidos esses dados, o próximo passo é o ajuste de verificação (
checkid_setup
): o consumidor redireciona o cliente para o provedor, passando os seguintes dados em GET
ou POST
:openid.mode
: o modo,checkid_setup
;openid.identity
: a identidade do cliente;openid.return_to
: a URL para onde o provedor deve redirecionar o cliente depois da autenticação;openid.trust_root
: o nome do servidor do consumidor;openid.ns
: a versão do OpenID,http://specs.openid.net/auth/2.0
;openid.claimed_id
: a URL original fornecida pelo cliente (geralmente igual à identidade).
Depois disso o cliente se resolverá com o provedor. Depois o provedor redirecionará o cliente de volta ao consumidor, para a URL informada por
return_to
, passando os seguintes parâmetros em POST
:openid.mode
: pode serid_res
se tudo correu bem, oucancel
;openid.identity
: a identidade do cliente;openid.return_to
: a mesma URL que o provedor recebeu no passo anterior;openid.signed
: lista de parâmetros cobertos pela assinatura;openid.sig
: string chave da assinatura;openid.invalid_handle
: se o provedor rejeitou algum parâmetro, ele será informado aqui.
No entanto é preciso verificar se esses dados vieram do provedor mesmo ou se foram forjados. Para tanto, valos ao próximo passo, a verificação da autenticação (
check_authentication
).O consumidor acessa diretamente o provedor via HTTP reenviando os dados recebidos, mas mudando o parâmetro
openid.mode
para check_authentication
.O provedor deve responder o consumidor com uma página texto, com os parâmetros terminados por mudança de linha (LF), cada linha no formato
chave:valor
.As chaves recebidas são:
is_valid
:true
caso o provedor tenha mesmo enviado os dados oufalse
;invalid_handle
: caso algum campo não tenha sido enviada pelo provedor, ele será informado aqui.
No entanto não é possível trocar dados de persona, que são as informações sobre o usuário.
Se for necessário obter informações de persona, é preciso usar o smart mode.
Smart mode
Esse modo é usado quando se deseja trocar dados de persona, como nome completo, endereço de correio, língua ou país.
Após o cliente ter enviado ao consumidor sua URL e o consumidor tenha identificado o provedor e a identidade, o consumidor precisa então escolher um par gerador-módulo para criptografia Diffie-Hellman. Geralmente é usado 2 como gerador e um primo seguro de 1024 bits como módulo.
O consumidor deve então escolher uma chave privada, um número grande maior que um e menor que o módulo menos um, e calcular a chave pública:
geradorchave_privada≡
chave_publicamod
módulo
Todos esses números grandes devem ser convertidos em formato
btwoc
(big-endian signed two's complement), representados como base64.Então é feita a associação: o consumidor acessa diretamente o provedor via HTTP, passando os seguintes dados via
GET
ou POST
:openid.mode
:associate
, indicando que se trata de uma associação;openid.assoc_type
:HMAC-SHA1
para chaves de 160 bits ouHMAC-SHA256
para chaves de 256 bits (acoselho 256b);openid.session_type
:DH-SHA1
ouDH-SHA256
, conforme o parâmetro anterior;openid.dh_modulus
: o módulo escolhido no formato correto (base64 !! btwoc
);openid.dh_gen
: o gerador no formato correto(se for 2, seráAg==
);openid.dh_consumer_public
: a chave pública calculada.
A resposta será similar à resposta ao
check_authorization
, ou seja, parâmetros encerrados por mudança de linha e dois pontos (:
) separando chave e valor.Os parâmetros são:
assoc_type
: o tipo de associação (o mesmo enviado pelo consumidor);assoc_handle
: uma chave que deve ser informada a cada conexão posterior;expires_in
: indica quando oassoc_handle
expira;session_type
: o mesmo tipo enviado pelo consumidor;dh_server_public
: a chave pública do servidor;enc_mac_key
: o segredo criptogrado.
Então o consumidor deve armazenar esses dados e, assim como no dumb mode, efetuar a verificação de autenticação (
checkid_setup
), da mesma forma vista anteriormente, mas com umas chaves a mais.O primeiro é a chave
openid.assoc_handle
, informando a mesma chave recebida anteriormente.Caso queira obter dados de SRE (Simple Registration Extension, ou
sreg
), os parâmetros extra passados são:openid.ns.reg
: a versão:http://openid.net/extensions/sreg/1.1
;openid.sreg.required
: os campos requeridos separados por vírgulas;openid.sreg.optional
: campos opcionais separados por vírgulas;openid.sreg.policy_url
: uma URL que informe o que será feito com os dados.
Caso queira obter dados de AX (Attribute Exchange), siga a URL. =P
Quando o cliente for redirecionado de volta para o consumidor, o consumidor receberá via
POST
os mesmos dados recebidos no dumb mode, mas com alguns parâmetros extra: openid.sreg.*
, onde *
é cada um dos campos requeridos e opcionais solicitados.Resumo
Ou seja, em dumb mode:
checkid_setup
check_authentication
Em smart mode:
associate
checkid_setup
Alternativamente pode ser usado
checkid_immadiate
em vez de checkid_setup
, geralmente quando trabalando com AJAX. Veja as especificações.Espero ter ajudado.
[]'s
Cacilhas