请求令牌时返回错误的范围

时间:2018-05-02 12:26:01

标签: python-3.x office365api

我正在尝试为我公司的用户建立一个O365服务状态门户。只有管​​理员才能看到管理员门户状态页面,但我们希望将这些信息提供给我们的用户/显示在仪表板上。

我已经在Azure中注册了该应用,并根据文档为其提供了正确的权限。我可以请求一个auth代码,我可以使用它来检索JWT,但是当令牌返回给我时,我只是在范围内看到User.Read,这意味着我无法将它用于任何ServiceComms API中的函数。

以下是用于检索令牌的代码片段:

url = 'https://login.microsoftonline.com/<tenantid>/oauth2/token'
r = requests.post(url, dict(resource='<appid>',
client_id='<clientid>',
redirect_uri='http://x.x.x.x/365/auth/index.htm',
client_secret='<itsasecret>',
grant_type='authorization_code',
code=auth_code))

以下是返回内容的第一部分:

{"token_type":"Bearer","scope":"User.Read","expires_in":"3600","ext_expires_in":"0","expires_on":"1525266602","not_before":"1525262702",

最初用于检索身份验证代码的帐户是租户的全局管理员,所以我希望这很好,但我是新手,所以可能是错误的。

有没有人有任何想法? 感谢。

1 个答案:

答案 0 :(得分:0)

我假设您已在Azure门户中为您的应用注册设置了相应的权限,而您的问题就是它们未显示在令牌中的原因。

如果您登录的用户之前已同意User.Read权限,我之前已经在使用Azure v1端点时看到过此行为,然后您更新了门户网站中所需的权限。虽然假设Azure会检测到此更改并重新提示是合乎逻辑的,但事实并非如此。它根据先前记录的同意不断返回令牌,并且不会拿起新的牌。

要处理此问题,您的应用必须在授权阶段在网址上包含prompt=consent查询参数。这应该在用户登录并获取新权限时强制同意。