Fluxo de código do dispositivo

A autenticação interativa com a ID do Microsoft Entra requer um navegador da Web. No entanto, no caso de dispositivos e sistemas operacionais que não fornecem um navegador da Web, o fluxo de código do dispositivo permite que o usuário use outro dispositivo (por exemplo, outro computador ou um telefone celular) para entrar interativamente. Ao usar o fluxo de código do dispositivo, o aplicativo obtém tokens por meio de um processo de duas etapas especialmente projetado para esses dispositivos/sistemas operacionais. Exemplos desses aplicativos são aplicativos executados em dispositivos de IoT, ou ferramentas de linha de comando (CLI).

Um fluxo de código de dispositivo típico segue as etapas:

  1. Sempre que a autenticação do usuário for necessária, o aplicativo fornecerá um código para o usuário. O usuário é solicitado a usar outro dispositivo, como um smartphone conectado à Internet, para acessar uma URL, por exemplo, https://microsoft.com/devicelogine inserir o código. Isso feito, a página da Web conduz o usuário por uma experiência de autenticação normal, a qual inclui solicitações de consentimento e autenticação multifator, se necessário.

  2. Após a autenticação bem-sucedida, o aplicativo de linha de comando recebe os tokens necessários por meio de um canal de apoio e os usa para executar as chamadas à API Web necessárias.

Restrições

  • O Fluxo de Código do Dispositivo só está disponível para aplicativos cliente públicos
  • A autoridade informada em PublicClientApplication precisa ser configurada como uma das opções abaixo:
    • Com locatários do formulário https://login.microsoftonline.com/{tenant}/ em que tenant é o GUID que representa a ID do locatário ou um domínio associado ao locatário.
    • Todas as contas corporativas e escolares (https://login.microsoftonline.com/organizations/)

As contas pessoais da Microsoft ainda não são compatíveis com o ponto de extremidade do Azure AD v2.0. Não é possível usar os locatários /common ou /consumers.

Fragmento de código

PublicClientApplication app = PublicClientApplication.builder(PUBLIC_CLIENT_ID)
        .authority(AUTHORITY)
        .build();

Consumer<DeviceCode> deviceCodeConsumer = (DeviceCode deviceCode) -> {
    System.out.println(deviceCode.message());
};

CompletableFuture<IAuthenticationResult> future = app.acquireToken(
        DeviceCodeFlowParameters.builder(scope, deviceCodeConsumer).build());


future.handle((res, ex) -> {
    if(ex != null) {
        System.out.println("message - " + ex.getMessage());
        return "Unknown!";
    }
    System.out.println("Access Token - " + res.accessToken());
    System.out.println("ID Token - " + res.idToken());
    return res;
});

future.join();

Informações adicionais

Caso deseje saber mais sobre o fluxo de código do dispositivo: