使用 Microsoft Entra ID 进行的交互式身份验证需要 Web 浏览器。 但是,对于不提供 Web 浏览器的设备和操作系统,设备代码流允许用户使用另一台设备(例如另一台计算机或移动电话)以交互方式登录。 通过使用设备代码流,应用程序通过专为这些设备/OS 设计的双重过程获取令牌。 此类应用程序的示例包括 IoT 上运行的应用程序,或 Command-Line 工具(CLI)。
典型的设备代码流遵循以下步骤:
每当需要用户身份验证时,应用就会为用户提供一个代码。 用户被要求使用另一台设备(例如连接 Internet 的智能手机)转到 URL,例如
https://microsoft.com/devicelogin,并输入代码。 完成此操作后,网页将引导用户进行常规的身份验证操作,其中包括同意提示和多重身份验证(如有必要)。身份验证成功后,命令行应用通过后端通道接收所需的令牌,并使用它们来执行所需的 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();
其他信息
若要了解有关设备代码流的详细信息,请执行以下操作: