示例项目之间为Active Directory返回的AccessToken有所不同

时间:2018-10-05 02:05:55

标签: java azure spring-boot active-directory azure-active-directory

我一直在使用两个示例项目尝试Java的Azure Active Directory访问:

1)https://github.com/AzureAD/azure-activedirectory-library-for-java,它使用OAuth令牌建立了独立的战争来确保安全性,并且

2)https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-active-directory-spring-boot-backend-sample用于弹簧引导嵌入式容器

我无法理解API的使用方式上的差异。

在这两种情况下,我都使用Azure凭据登录获得了用于AD的OAuth令牌。 在Http响应中,我得到以下形式的authorizationCode:

  

AQABAAIAAAD .....

然后使用以下URL作为authContext: https://login.microsoftonline.com/ {tenantId}

我通过以下调用获得AuthenticationResult:

Future<AuthenticationResult> future = authContext.acquireTokenByAuthorizationCode(authorizationCode, redirectUri, credential, null);

在Adal4j项目(1)中,AuthenticationResult的AccessToken的格式为:

  

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6I ...

我可以在HTTP调用中用作承载令牌,以通过https://graph.windows.net/myorganization/me/thumbnailPhoto?api-version=1.6

检索用户的个人资料图片

在SpringBoot AD示例中,从完全相同的调用返回的AccessToken的形式为:

  

AQABAAAAAADXzZ3ifr-GRbDT ....

如果我使用完全相同的方法来尝试检索用户的个人资料图片,则会收到401未经授权的回复

这些AccessToken的形式和使用不同的原因是什么?

1 个答案:

答案 0 :(得分:0)

  

这些AccessToken的形式和使用不同的原因是什么?

我假设您获得的访问令牌是 authorization_code ,而不是承载令牌。

正如Rohit Saigal提到的那样,您可以使用JWT.IOJWT.MS进行检查。

如果要获取Azure AD图的访问令牌,可以使用以下代码来实现。

public String index(Model model, OAuth2AuthenticationToken authentication) {
...
DefaultOidcUser user = (DefaultOidcUser)authentication.getPrincipal();
String accessToken = user.getIdToken().getTokenValue(); 
...
}

然后,如果您具有相应的权限,我们可以使用访问令牌来访问Azure AD图形api。