Autor
João Marçal
Software • Jan 08, 2018
5
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 é 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:

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:
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.
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
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!

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
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.
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!
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