如何使用JavaScript中的Microsoft身份验证库(MSAL)获取个人Microsoft帐户的联系人?

时间:2019-06-03 16:48:04

标签: javascript microsoft-graph msal.js

我已经通过使用Azure AD仪表板实现了MSAL库,并授予了user.read,user.read.all,contacts.read,contacts.read.all,openid,配置文件,directory.read.all的权限。租户(同一组织中的帐户)能够登录其帐户,并能够使用访问令牌来获取其联系人。当我尝试使用任何Microsoft个人帐户时,登录均能正常工作,能够获取访问令牌,但是当我使用终结点(https://graph.microsoft.com/v1.0/me/contacts)进行Microsoft Graph api调用时,出现401未经授权错误。

当我检查请求的响应对象以获取访问令牌时,对于租户,响应包括范围数组:

scopes: Array(13)
0: "Calendars.Read"
1: "Calendars.Read.Shared"
2: "Calendars.ReadWrite"
3: "Calendars.ReadWrite.Shared"
4: "Contacts.Read"
5: "Directory.AccessAsUser.All"
6: "Directory.Read.All"
7: "openid"
8: "profile"
9: "User.Read"
10: "User.Read.All"
11: "User.ReadBasic.All"
12: "email"

对于个人帐户,它是:

scopes: Array(2)
0: "openid"
1: "profile"

以某种方式,个人帐户无法获得管理员授予的范围的权限。

我注册的应用程序还支持以下帐户类型:

Accounts in any organizational directory and personal Microsoft accounts (e.g. Skype, Xbox, Outlook.com)
All users with a work or school, or personal Microsoft account can use your application or API. This includes Office 365 subscribers.

这是我的代码中用于登录用户的配置:

let msalConfig = {
  auth: {
    clientId: <client_id>
};
let signinScopes = ['user.read.all', 'contacts.read'];

以及我提出访问令牌请求时通过的范围:

let tokenRequest = {
          scopes: ["user.read.all"]
        };

当我在下面传递令牌时,出现错误消息“由于一个或多个请求的作用域未经授权或已过期,因此请求被拒绝。用户必须首先登录并授予客户端应用程序访问所请求范围的权限。'

 var tokenRequest = {
          scopes: ["user.read.all", "contacts.read"]
        };

我希望获得所有已登录的Microsoft帐户的联系人。

1 个答案:

答案 0 :(得分:0)

您不能为Microsoft(也称为个人)帐户请求user.read.all

范围请求应如下所示:

scopes: ["user.read", "contacts.read"]