fluxo de concessão implícita da plataforma de identidade da Microsoft e OAuth 2.0

A plataforma de identidade da Microsoft dá suporte ao fluxo de concessão implícita do OAuth 2.0, conforme descrito na Especificação do OAuth 2.0. A definição da característica da concessão implícita é que os tokens (tokens de ID ou tokens de acesso) são retornados diretamente do ponto de extremidade /authorize em vez do ponto de extremidade /token. Isso geralmente é usado como parte do fluxo do código de autorização, em que é chamado de “fluxo híbrido” – recuperando o token de ID na solicitação /authorize junto com um código de autorização.

Este artigo descreve como programar diretamente no protocolo do seu aplicativo para solicitar tokens do Microsoft Entra ID. Quando possível, recomendamos que você use as MSAL (bibliotecas de autenticação da Microsoft) com suporte para adquirir tokens e chamar APIs Web seguras. Confira também os aplicativos de exemplo que usam MSAL.

Prefira o fluxo do código de autenticação

Com os planos para remover cookies de terceiros dos navegadores, o fluxo de concessão implícita não é mais um método de autenticação adequado. As funcionalidades de SSO (logon único) silenciosas do fluxo implícito não funcionam sem cookies de terceiros, fazendo com que os aplicativos sejam interrompidos quando tentam obter um novo token. É altamente recomendável que todos os novos aplicativos usem o fluxo de código de autorização que agora dá suporte a aplicativos de página única no lugar do fluxo implícito. Os aplicativos de página única existentes também devem migrar para o fluxo de código de autorização.

Cenários adequados para a concessão implícita OAuth2

A concessão implícita é apenas confiável para a parte inicial e interativa do seu fluxo de entrada, em que a falta de cookies de terceiros não pode afetar o seu aplicativo. Essa limitação significa que você deve usá-la exclusivamente como parte do fluxo híbrido, em que seu aplicativo solicita um código, bem como um token do ponto de extremidade de autorização. Em um fluxo híbrido, o seu aplicativo recebe um código que pode ser resgatado para um token de atualização, garantindo assim que a sessão de logon do aplicativo permaneça válida ao longo do tempo.

Diagrama de protocolo

O diagrama a seguir mostra a aparência de todo o fluxo de entrada implícita e as seções a seguir descrevem cada etapa em detalhes.

Diagram showing the implicit sign-in flow

Enviar a solicitação de conexão

Para autenticar inicialmente o usuário em seu aplicativo, você pode enviar uma solicitação de autenticação OpenID Connect e obter um id_token da plataforma de identidade da Microsoft.

Importante

Para solicitar um token de ID e/ou um token de acesso com sucesso, o registro de aplicativo na página do centro de administração do Microsoft Entra – Registros de aplicativo precisa ter o fluxo de concessão implícita correspondente habilitado, selecionando tokens de ID e tokens de acesso na seção Concessão implícita e fluxos híbridos. Se não estiver habilitado, será retornado um erro unsupported_response:

The provided value for the input parameter 'response_type' is not allowed for this client. Expected value is 'code'

// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&response_type=id_token
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&scope=openid
&response_mode=fragment
&state=12345
&nonce=678910
Parâmetro Tipo Descrição
tenant obrigatório O valor {tenant} no caminho da solicitação pode ser usado para controlar quem pode entrar no aplicativo. Os valores permitidos são common, organizations, consumers e identificadores de locatário. Para obter mais detalhes, consulte noções básicas de protocolo. Criticamente, para cenários de convidado em que você conecta um usuário de um locatário a outro locatário, você deve fornecer o identificador de locatário para que ele se conecte corretamente no locatário do recurso.
client_id obrigatório A ID do aplicativo (cliente) que a página do centro de administração do Microsoft Entra – Registros de aplicativo atribui ao seu aplicativo.
response_type obrigatório Deve incluir id_token para conexão do OpenID Connect. Também pode incluir o response_type, token. O uso de token aqui permitirá que seu aplicativo receba imediatamente um token de acesso do ponto de extremidade de autorização sem precisar fazer uma segunda solicitação ao ponto de extremidade de autorização. Se você usar o response_type token, o parâmetro scope deve conter um escopo indicando para qual recurso emitir o token (por exemplo, user.read no Microsoft Graph). Ele também pode conter code no lugar de token para fornecer um código de autorização para uso no fluxo do código de autorização. Essa resposta id_token+code às vezes é chamada de fluxo híbrido.
redirect_uri recomendável O URI de redirecionamento do seu aplicativo, onde as respostas de autenticação podem ser enviadas e recebidas pelo aplicativo. Ele precisa corresponder exatamente a um dos URIs de redirecionamento que você registrou no portal, exceto que deve ser codificado como URL.
scope obrigatório Uma lista de escopos separados por espaços. Para o OpenID Connect (id_tokens), é necessário incluir o escopo openid, que é traduzido para a permissão "Fazer seu logon" na interface do usuário de consentimento. Como opção, convém incluir os escopos email e profile para obter acesso a dados adicionais do usuário. Você também poderá incluir outros escopos nessa solicitação a fim de solicitar o consentimento a vários recursos, se um token de acesso for solicitado.
response_mode opcionais Especifica o método que deve ser usado para enviar o token resultante de volta ao seu aplicativo. O padrão é consulta para apenas um token de acesso, mas é fragmento caso a solicitação inclua um id_token.
state recomendável Um valor incluído na solicitação também será retornado na resposta do token. Pode ser uma cadeia de caracteres de qualquer conteúdo desejado. Um valor exclusivo gerado aleatoriamente normalmente é usado para impedir ataques de solicitação intersite forjada. O estado também é usado para codificar informações sobre o estado do usuário no aplicativo antes que a solicitação de autenticação ocorra, como a página ou a exibição em que ele estava.
nonce obrigatório Um valor incluído na solicitação, gerado pelo aplicativo, que será incluído no token de ID resultante como uma declaração. O aplicativo pode, então, verificar esse valor para atenuar os ataques de reprodução de token. O valor normalmente é uma cadeia de caracteres aleatória e exclusiva que pode ser usada para identificar a origem da solicitação. Obrigatório somente quando um id_token é solicitado.
prompt opcionais Indica o tipo de interação do usuário que é necessário. Os únicos valores válidos no momento são login, none, select_account e consent. prompt=login forçará o usuário a inserir suas credenciais na solicitação, negando o logon único. prompt=none é o oposto – ele garantirá que o usuário não seja apresentado a nenhum prompt interativo. Se a solicitação não puder ser concluída silenciosamente via SSO, a plataforma de identidade da Microsoft retornará um erro. prompt=select_account envia o usuário para um seletor de conta em que todas as contas lembradas na sessão serão exibidas. prompt=consent irá disparar a caixa de diálogo de consentimento do OAuth depois que o usuário iniciar a sessão, solicitando que ele conceda permissões ao aplicativo.
login_hint opcionais Você pode usar esse parâmetro para preencher previamente o campo de nome de usuário/endereço de email da página de entrada do usuário, se você souber o nome de usuário com antecedência. Muitas vezes, os aplicativos usam esse parâmetro durante a reautenticação, depois de já terem extraído a login_hintdeclaração opcional de uma entrada anterior.
domain_hint opcionais Se for incluído, ele ignorará o processo de descoberta baseada em email que o usuário passa na página de entrada, resultando em uma experiência de usuário um pouco mais simples. Esse parâmetro é usado normalmente para aplicativos de Linha de Negócios que operam em um único locatário, no qual eles fornecem um nome de domínio dentro de um determinado locatário, encaminhando o usuário para o provedor de federação para esse locatário. Essa dica impede que os convidados entrem neste aplicativo e limita o uso de credenciais de nuvem como FIDO.

Neste ponto, o usuário será solicitado a inserir suas credenciais e concluir a autenticação. A plataforma de identidade da Microsoft também garantirá que o usuário tenha consentido com as permissões indicadas no parâmetro de consulta scope. Se o usuário não consentir a nenhuma dessas permissões, ele será solicitado a consentir às permissões necessárias. Para obter mais informações, consulte permissões, consentimento e aplicativos multilocatários.

Depois que o usuário se autentica e dá consentimento, a plataforma de identidade da Microsoft retorna uma resposta ao aplicativo no redirect_uri indicado usando o método especificado no parâmetro response_mode.

Resposta bem-sucedida

Uma resposta bem-sucedida usando response_mode=fragment e response_type=id_token+code é semelhante ao seguinte (com quebras de linha para legibilidade):

GET https://localhost/myapp/#
code=0.AgAAktYV-sfpYESnQynylW_UKZmH-C9y_G1A
&id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&state=12345
Parâmetro Descrição
code Incluído se response_type incluir code. É um código de autorização adequado para uso no fluxo de código de autorização.
access_token Incluído se response_type incluir token. O token de acesso que o aplicativo solicitou. O token de acesso não deve ser decodificado ou inspecionado de outra forma, ele deve ser tratado como uma cadeia de caracteres opaca.
token_type Incluído se response_type incluir token. Este sempre será Bearer.
expires_in Incluído se response_type incluir token. Indica o número de segundos pelos quais o token é válido para fins de cache.
scope Incluído se response_type incluir token. Indica os escopos para os quais o access_token será válido. Talvez não inclua todos os escopos solicitados se eles não forem aplicáveis ao usuário. Por exemplo, escopos somente Microsoft Entra solicitados ao fazer logon usando uma conta pessoal.
id_token Um JWT (JSON Web Token) assinado. O aplicativo pode decodificar os segmentos desse token para solicitar informações sobre o usuário que se conectou. O aplicativo pode armazenar em cache os valores e exibi-los, mas não deve confiar neles para nenhuma autorização ou limite de segurança. Para obter mais informações sobre tokens de ID, confira id_token reference.
Observação: somente fornecido se o escopo openid for solicitado e se response_type tiver incluído id_tokens.
state Se um parâmetro de estado for incluído na solicitação, o mesmo valor deverá aparecer na resposta. O aplicativo deve verificar se os valores de estado na solicitação e na resposta são idênticos.

Aviso

Não tente validar nem ler tokens de APIs que não sejam suas em seu código, incluindo os tokens deste exemplo. Os tokens de serviços da Microsoft podem usar um formato especial que não será validado como um JWT e também podem ser criptografados para usuários do consumidor (conta Microsoft). Embora a leitura de tokens seja uma ferramenta útil de depuração e aprendizagem, não assuma dependências disso em seu código ou assuma informações específicas sobre tokens que não são de uma API que você controla.

Resposta de erro

As respostas de erro também podem ser enviadas ao redirect_uri para que o aplicativo possa tratá-las adequadamente:

GET https://localhost/myapp/#
error=access_denied
&error_description=the+user+canceled+the+authentication
Parâmetro Descrição
error Uma cadeia de caracteres de códigos de erro que pode ser usada para classificar tipos de erro que ocorrem e pode ser usada para responder aos erros.
error_description Uma mensagem de erro específica que pode ajudar um desenvolvedor a identificar a causa raiz de um erro de autenticação.

Adquirir tokens de acesso silenciosamente

Importante

Essa parte do fluxo implícito provavelmente não funcionará para seu aplicativo, pois é usada em diferentes navegadores devido à remoção de cookies de terceiros por padrão. Embora isso ainda funcione atualmente em navegadores baseados em Chromium que não estão em Incognito, os desenvolvedores devem reconsiderar o uso dessa parte do fluxo. Em navegadores que não dão suporte a cookies de terceiros, você receberá um erro indicando que nenhum usuário está conectado, pois os cookies de sessão da página de logon foram removidos pelo navegador.

Agora que você autenticou o usuário em seu aplicativo de página única, pode silenciosamente obter tokens de acesso para chamar APIs Web protegidas pela plataforma de identidade da Microsoft, como o Microsoft Graph. Mesmo se já tiver recebido um token usando o response_type token, você poderá usar esse método para adquirir tokens para recursos adicionais sem redirecionar o usuário para entrar novamente.

No fluxo normal de OpenID Connect/OAuth, você faria isso por meio de uma solicitação para o ponto de extremidade /token da plataforma de identidade da Microsoft. Você pode fazer a solicitação em um iframe oculto para obter novos tokens para outras APIs da Web:

// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=00001111-aaaa-2222-bbbb-3333cccc4444&response_type=token
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
&response_mode=fragment
&state=12345
&nonce=678910
&prompt=none
&login_hint=myuser@mycompany.com

Para obter detalhes sobre os parâmetros de consulta na URL, consulte enviar a solicitação de entrada.

Dica

Tente copiar e colar a solicitação abaixo em uma guia do navegador! (Não se esqueça de substituir os valores login_hint pelos valores corretos para o seu usuário)

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=535fb089-9ff3-47b6-9bfb-4f1264799865&response_type=token&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read&response_mode=fragment&state=12345&nonce=678910&prompt=none&login_hint={your-username}

Observe que isso funcionará mesmo em navegadores sem suporte a cookies de terceiros, já que você está inserindo isso diretamente em uma barra de navegador, em vez de abri-lo em um iframe.

Graças ao parâmetro prompt=none , essa solicitação terá êxito ou falhará imediatamente e retornará ao seu aplicativo. A resposta bem-sucedida será enviada ao seu aplicativo no redirect_uri indicado, usando o método especificado no parâmetro response_mode.

Resposta bem-sucedida

Uma resposta bem-sucedida usando response_mode=fragment tem a seguinte aparência:

GET https://localhost/myapp/#
access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&state=12345
&token_type=Bearer
&expires_in=3599
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fdirectory.read
Parâmetro Descrição
access_token Incluído se response_type incluir token. O token de acesso solicitado pelo aplicativo, nesse caso para o Microsoft Graph. O token de acesso não deve ser decodificado ou inspecionado de outra forma, ele deve ser tratado como uma cadeia de caracteres opaca.
token_type Este sempre será Bearer.
expires_in Indica o número de segundos pelos quais o token é válido para fins de cache.
scope Indica os escopos para os quais o token de acesso será válido. Pode não incluir todos os escopos solicitados, se eles não eram aplicáveis ao usuário (no caso de escopos somente do Microsoft Entra sendo solicitados quando uma conta pessoal é usada para fazer logon).
id_token Um JWT (JSON Web Token) assinado. Incluído se response_type incluir id_token. O aplicativo pode decodificar os segmentos desse token para solicitar informações sobre o usuário que se conectou. O aplicativo pode armazenar em cache os valores e exibi-los, mas não deve confiar neles para nenhuma autorização ou limite de segurança. Para obter mais informações sobre id_tokens, veja a referência id_token.
Observação: Somente fornecido se o escopo openid for solicitado.
state Se um parâmetro de estado for incluído na solicitação, o mesmo valor deverá aparecer na resposta. O aplicativo deve verificar se os valores de estado na solicitação e na resposta são idênticos.

Resposta de erro

As respostas de erro também podem ser enviadas ao redirect_uri para que o aplicativo possa tratá-las adequadamente. No caso de prompt=none, um erro esperado será:

GET https://localhost/myapp/#
error=user_authentication_required
&error_description=the+request+could+not+be+completed+silently
Parâmetro Descrição
error Uma cadeia de caracteres de códigos de erro que pode ser usada para classificar tipos de erro que ocorrem e pode ser usada para responder aos erros.
error_description Uma mensagem de erro específica que pode ajudar um desenvolvedor a identificar a causa raiz de um erro de autenticação.

Se você receber esse erro na solicitação do iframe, o usuário deverá entrar novamente de forma interativa para recuperar um novo token. Você pode escolher lidar com isso da maneira que fizer mais sentido para seu aplicativo.

Atualizando tokens

A concessão implícita não fornece tokens de atualização. Os tokens de ID e os tokens de acesso expirarão após um curto período de tempo, portanto, seu aplicativo deve estar preparado para atualizar esses tokens periodicamente. Para atualizar qualquer tipo de token, você pode executar a mesma solicitação de iframe oculto acima usando o parâmetro prompt=none para controlar o comportamento da plataforma de identidade. Se você deseja receber um novo token de ID, certifique-se de usar id_token em response_type e scope=openid, bem como um parâmetro nonce.

Em navegadores que não dão suporte a cookies de terceiros, isso resultará em um erro indicando que nenhum usuário está conectado.

Enviar uma solicitação de saída

O OpenID Connect end_session_endpoint permite que o seu aplicativo envie uma solicitação para a plataforma de identidade da Microsoft para encerrar a sessão de um usuário e limpar os cookies definidos pela plataforma de identidade da Microsoft. Para desconectar por completo um usuário de um aplicativo Web, seu aplicativo deve encerrar sua própria sessão com o usuário (normalmente, limpando o cache de token ou removendo cookies) e, depois, redirecionar o navegador para:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/logout?post_logout_redirect_uri=https://localhost/myapp/
Parâmetro Tipo Descrição
tenant obrigatório O valor {tenant} no caminho da solicitação pode ser usado para controlar quem pode entrar no aplicativo. Os valores permitidos são common, organizations, consumers e identificadores de locatário. Para obter mais detalhes, consulte noções básicas de protocolo.
post_logout_redirect_uri recomendável A URL para a qual o usuário deve retornar após a conclusão do logoff. Esse valor deve corresponder a um dos URIs de redirecionamento registrados no aplicativo. Se ele não estiver incluído, o usuário verá uma mensagem genérica pela plataforma de identidade da Microsoft.

Próximas etapas