使用 adal4j 从 Azure 获取用户名和组信息
Getting username and group info from Azure using adal4j
我正在开发一个移动应用程序,我需要在其中根据 Azure AD 对用户进行身份验证。基本上,系统会提示用户他们的组织电子邮件和密码,移动 phone 应用程序会将其发送到将进行身份验证的后端服务器。
我有 'azure-activedirectory-library-for-java' 的 'public-client-app-sample' 工作,并且可以针对 'graph.windows.net' 进行身份验证:
private static AuthenticationResult getAccessTokenFromUserCredentials(
String username, String password) throws Exception {
AuthenticationContext context = null;
AuthenticationResult result = null;
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(1);
context = new AuthenticationContext(AUTHORITY, false, service);
Future<AuthenticationResult> future = context.acquireToken(
"https://graph.windows.net", CLIENT_ID, username, password,
null);
result = future.get();
} finally {
service.shutdown();
}
if (result == null) {
throw new ServiceUnavailableException(
"authentication result was null");
}
return result;
}
但是,这 return 没有任何 userInfo(为空),此时我无法弄清楚如何查询以获取包含用户所属组的列表?
我只是使用从 Adal4j 获得的标记使用 API 进行手动查找,还是库中提供了函数?
我只是从 Azure 开始,所以很明显,我可能只是找错了地方。我试过了“https://graph.windows.net/xxx.com/groups?api-version=1.5”但得到“资源 'https://graph.windows.net/xxx.com/groups?api-version=1.5' 未注册该帐户。”
首先,您完全正确,adal4j 未能 return UserInfo。这样做的原因是令牌请求不包含 scope=openid
参数,如果调用者希望在响应中包含 id_token
,则该参数是必需的。我开了一个issue, and it has already been resolved。因此,adal4j 的更新副本将解决您第一个未获取 UserInfo 的问题。
现在,关于当前用户的组成员身份:通常,我会建议您直接 configure you application to return the groups
claim。这可以通过更改应用程序清单(通过 Azure 门户在应用程序的配置页面下下载和上传)来轻松完成,包括:
"groupMembershipClaims": "All",
不幸的是,adal4j 还没有在 getUserInfo()
的结果中包含团体声明,因此这可能对您没有多大用处(issue打开了,这真的取决于它实现的速度有多快,或者你是否想自己实现)。
无论如何,因为令牌中可能包含太多组(用 表示,您的应用程序应该始终能够使用 AAD 图 API 到 retrieve the full set of groups用户是成员。
最后一点:adal4j 没有实现 Azure AD Graph API 的客户端。所以是的,您必须自己实施(或者 use/modify 现有的 OData 客户端)。
(您可以阅读有关 Group Claims in this Azure AD blog post 的更多信息。)
我正在开发一个移动应用程序,我需要在其中根据 Azure AD 对用户进行身份验证。基本上,系统会提示用户他们的组织电子邮件和密码,移动 phone 应用程序会将其发送到将进行身份验证的后端服务器。
我有 'azure-activedirectory-library-for-java' 的 'public-client-app-sample' 工作,并且可以针对 'graph.windows.net' 进行身份验证:
private static AuthenticationResult getAccessTokenFromUserCredentials(
String username, String password) throws Exception {
AuthenticationContext context = null;
AuthenticationResult result = null;
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(1);
context = new AuthenticationContext(AUTHORITY, false, service);
Future<AuthenticationResult> future = context.acquireToken(
"https://graph.windows.net", CLIENT_ID, username, password,
null);
result = future.get();
} finally {
service.shutdown();
}
if (result == null) {
throw new ServiceUnavailableException(
"authentication result was null");
}
return result;
}
但是,这 return 没有任何 userInfo(为空),此时我无法弄清楚如何查询以获取包含用户所属组的列表?
我只是使用从 Adal4j 获得的标记使用 API 进行手动查找,还是库中提供了函数?
我只是从 Azure 开始,所以很明显,我可能只是找错了地方。我试过了“https://graph.windows.net/xxx.com/groups?api-version=1.5”但得到“资源 'https://graph.windows.net/xxx.com/groups?api-version=1.5' 未注册该帐户。”
首先,您完全正确,adal4j 未能 return UserInfo。这样做的原因是令牌请求不包含 scope=openid
参数,如果调用者希望在响应中包含 id_token
,则该参数是必需的。我开了一个issue, and it has already been resolved。因此,adal4j 的更新副本将解决您第一个未获取 UserInfo 的问题。
现在,关于当前用户的组成员身份:通常,我会建议您直接 configure you application to return the groups
claim。这可以通过更改应用程序清单(通过 Azure 门户在应用程序的配置页面下下载和上传)来轻松完成,包括:
"groupMembershipClaims": "All",
不幸的是,adal4j 还没有在 getUserInfo()
的结果中包含团体声明,因此这可能对您没有多大用处(issue打开了,这真的取决于它实现的速度有多快,或者你是否想自己实现)。
无论如何,因为令牌中可能包含太多组(用 表示,您的应用程序应该始终能够使用 AAD 图 API 到 retrieve the full set of groups用户是成员。
最后一点:adal4j 没有实现 Azure AD Graph API 的客户端。所以是的,您必须自己实施(或者 use/modify 现有的 OData 客户端)。
(您可以阅读有关 Group Claims in this Azure AD blog post 的更多信息。)