设备代码流

使用 Microsoft Entra ID 进行的交互式身份验证需要 Web 浏览器。 但是,对于不提供 Web 浏览器的设备和操作系统,设备代码流允许用户使用另一台设备(例如另一台计算机或移动电话)以交互方式登录。 通过使用设备代码流,应用程序通过专为这些设备/OS 设计的双重过程获取令牌。 此类应用程序的示例包括 IoT 上运行的应用程序,或 Command-Line 工具(CLI)。

典型的设备代码流遵循以下步骤:

  1. 每当需要用户身份验证时,应用就会为用户提供一个代码。 用户被要求使用另一台设备(例如连接 Internet 的智能手机)转到 URL,例如 https://microsoft.com/devicelogin,并输入代码。 完成此操作后,网页将引导用户进行常规的身份验证操作,其中包括同意提示和多重身份验证(如有必要)。

  2. 身份验证成功后,命令行应用通过后端通道接收所需的令牌,并使用它们来执行所需的 Web API 调用。

限制条件

  • 设备代码流仅适用于公共客户端应用程序
  • PublicClientApplication 中传入的颁发机构必须配置为以下选项之一:
    • 采用 https://login.microsoftonline.com/{tenant}/ 格式的租户,其中 tenant 可以是表示租户 ID 的 GUID,也可以是与该租户关联的域。
    • 任何工作或学校账户(https://login.microsoftonline.com/organizations/

Azure AD v2.0 终结点尚不支持Microsoft个人帐户(无法使用/common/consumers租户)。

代码片段

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();

其他信息

若要了解有关设备代码流的详细信息,请执行以下操作: