面向Java的Active身份验证库 (ADAL4J)允许使用以下(简化的)代码通过对Microsoft Graph的访问令牌进行身份验证:
public String authenticate(String authorizationUrl, String clientId, String clientSecret) throws Exception {
ExecutorService service = Executors.newFixedThreadPool(1);
AuthenticationContext context = new AuthenticationContext(authorizationUrl, false, service);
ClientCredential credential = new ClientCredential(clientId, clientSecret);
Future<AuthenticationResult> future = context.acquireToken(“https://graph.microsoft.com”, credential, null);
return future.get().getAccessToken();
}上面的方法适用于图形的某些部分(例如,访问Office 365帐户),但不适用于OneDrive,因为它返回一个没有适当授权的访问令牌。
通过邮递员获取访问令牌的工作原理是预期的,具有以下参数:
authorizationUrl: https://login.microsoftonline.com/common/oauth2/v2.0/authorize
accessTokenUrl: https://login.microsoftonline.com/common/oauth2/v2.0/token
clientId: <the clientId for the application>
clientSecret: <the clientSecret for the application>
scope: https://graph.microsoft.com/.default
state: <empty>更具体地说,在邮递员中运行上述操作将返回带有其他作用域(包括https://graph.microsoft.com/Files.ReadWrite.All )的访问令牌。在调用上述Java方法的authenticate()应用程序中使用该访问令牌确实有效,例如,它使用/me/drive/root/children作为REST路径列出根目录的内容。
但是,如果使用authenticate()方法返回的访问令牌,则OneDrive将返回错误。如果在路径中使用特定的租户ID而不是me,则从路径中删除用户名(me)只返回一个文件名。
似乎无法在ADAL4J中添加作用域值,许多其他变体要么导致错误,要么返回一个文件(可能来自不同的上下文)。
有没有办法通过ADAL4J为OneDrive?获得完全授权的访问令牌?
发布于 2019-08-02 06:35:58
有两个不同的权限:一个是应用程序权限,另一个是委托权限。
“委托”权限使用已登录资源所有者的委托授权指定基于范围的访问,在运行时显示为客户端访问令牌中的"scp“声明。
使用客户端应用程序的凭据/标识指定基于角色的访问的“应用程序”权限在运行时以客户端访问令牌中的“角色”声明形式呈现给资源。
当你第一次从邮递员那里得到礼物时,你会被要求提供你的证件。通过这种方式,您将获得一个具有委托权限的令牌,该令牌表示帐户。因此,您可以在/me下调用Graph。
但是,用于获取令牌的java代码只能获得具有应用程序权限的访问令牌。应用程序没有用户标识,因此,在调用/me下的Graph时,您将得到一个错误。如果有应用程序权限,则只能将Graph调用为/user/{user-id}
解决方案:
您可以在Java中获得具有委托权限的访问令牌,如下所示:
( A)使用公共客户端平台创建应用程序

( B)添加必要的Graph权限,并为租户授予管理许可

( C)获取令牌
ExecutorService service = Executors.newFixedThreadPool(1);
AuthenticationContext context = null;
try {
context = new AuthenticationContext("https://login.microsoftonline.com/" + "TENANT_ID", false, service);
Future<AuthenticationResult> future = context.acquireToken("https://graph.microsoft.com", "client_id", "username", "password",null);
System.out.println( future.get().getAccessToken());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}finally {
service.shutdown();
}https://stackoverflow.com/questions/57292196
复制相似问题