Autor
João Marçal
João Marçal

Software • Jan 08, 2018
5

Azure Active Directory — Authentication OAuth 2.0

Azure Active Directory — Authentication OAuth 2.0
Nas últimas semanas, estive a trabalhar num serviço de integração para um sistema complexo baseado no Azure.

O meu objetivo era encontrar uma forma de autenticar no Azure Active Directory, basicamente obtendo o token de acesso para as futuras requisições ao sistema, sem o pop-up de login da Microsoft, muito comum em integrações com serviços como Facebook e outros.

O Microsoft Azure Active Directory (AD) já possui uma biblioteca de autenticação (ADAL), mas, infelizmente, não existe suporte para a linguagem que eu estava a utilizar no momento, GoLang. Diante desta situação, fui obrigado a encontrar uma solução alternativa.

OAuth 2.0


OAuth 2.0 é um protocolo de autorização que permite que as aplicações obtenham acesso limitado às contas dos utilizadores num serviço HTTP.

Não vou explicar todos os detalhes do protocolo aqui, o que vou me focar são nos grant types de autorização.

OAuth 2.0 tem quatro grant types:

  • Password;
  • Client Credentials;
  • Implicit;
  • Authorization Code.

1 5ge Ki Yz Sa L1 Gdb Eo Uxr Ua

 
Com esta informação e para resolver o meu problema, escolhi o fluxo de autorização Password Grant.

Para cenários semelhantes, quando se confia em clientes internos (first-party) ou de terceiros (third-party), tanto na web como em aplicações nativas, esta abordagem oferece ao utilizador final a melhor experiência.

Para mais informações sobre o OAuth 2.0, podes consultar aqui.

Microsoft Azure Active Directory e OAuth 2

Neste ponto, comecei a procurar como usar o tipo de fluxo Password Grant no Azure AD. A documentação da Microsoft não é muito útil nesse caso. Eles focam-se nos outros fluxos de grants usados em diferentes cenários, como:

  • Authorization Code para aplicações Web Server;
  • Implicit Grant para aplicações nativas;
  • Client Credentials para aplicações de serviço.
 
No entanto, o tipo de fluxo Resource Owner Password Credentials Grant também é suportado desde a versão 1.1 no Azure AD.

Este fluxo também é baseado em pedidos HTTP, mas sem redirecionamento de URL. Para mais informações sobre este fluxo, podes consultar aqui.

Assim, para este caso específico, quando temos um serviço de integração, como um windows service, para obter informações de uma aplicação que requer autenticação, esta abordagem é prática e eficiente.

Como usar


Para usar esse método e obter o token no Azure AD OAuth 2, precisamos fazer a seguinte solicitação de serviço web:

https://login.microsoftonline.com/<TenantId>/oauth2/token

  • Content-Type: application/x-www-form-urlencoded
  • Host: login.microsoftonline.com
  • TenantId: <MY_HOST> (for example “mywebsite.com”)
  • WS: /oauth2/token

Parâmetros a utilizar no Body request:


  • grant_type: password
  • client_id: O valor do Client Id do Azure AD
  • resource: O valor do App ID da aplicação para a qual deseja um access token
  • client_secret: O valor do Client Secret do Azure AD
  • username: O nome de utilizador de uma conta no Azure AD
  • password: A password da conta do utilizador

Resultado do request:


HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
 "token_type":"Bearer",
 "expires_in":"600",
 "expires_on":"1511533698",
 "not_before":"1511533698",
 "resource":"*resource*",
 "access_token":"*token*",
"refresh_token":"*token*",
 "scope":"user_impersonation"
}


Agora tens o teu token de acesso para usar na tua aplicação. Já tiveste esta necessidade ou tens outra abordagem? Fica à vontade para partilhar. Espero que estas informações sejam úteis para futuros desenvolvimentos!

1 S Xn Hrt63 Vj a or J H5 Jf Jb Ew

Result access token example


Já tiveste esta necessidade ou tens outra abordagem? Fica à vontade para partilhar.

Espero que estas informações sejam úteis para futuros desenvolvimentos!


@medium