首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于OneDrive的ADAL4J认证

基于OneDrive的ADAL4J认证
EN

Stack Overflow用户
提问于 2019-07-31 13:40:50
回答 1查看 311关注 0票数 0

面向Java的Active身份验证库 (ADAL4J)允许使用以下(简化的)代码通过对Microsoft Graph的访问令牌进行身份验证:

代码语言:javascript
复制
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,因为它返回一个没有适当授权的访问令牌。

通过邮递员获取访问令牌的工作原理是预期的,具有以下参数:

代码语言:javascript
复制
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?获得完全授权的访问令牌?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-02 06:35:58

有两个不同的权限:一个是应用程序权限,另一个是委托权限。

“委托”权限使用已登录资源所有者的委托授权指定基于范围的访问,在运行时显示为客户端访问令牌中的"scp“声明。

使用客户端应用程序的凭据/标识指定基于角色的访问的“应用程序”权限在运行时以客户端访问令牌中的“角色”声明形式呈现给资源。

当你第一次从邮递员那里得到礼物时,你会被要求提供你的证件。通过这种方式,您将获得一个具有委托权限的令牌,该令牌表示帐户。因此,您可以在/me下调用Graph。

但是,用于获取令牌的java代码只能获得具有应用程序权限的访问令牌。应用程序没有用户标识,因此,在调用/me下的Graph时,您将得到一个错误。如果有应用程序权限,则只能将Graph调用为/user/{user-id}

解决方案:

您可以在Java中获得具有委托权限的访问令牌,如下所示:

( A)使用公共客户端平台创建应用程序

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

( C)获取令牌

代码语言:javascript
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57292196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档