我正在尝试为我公司的用户建立一个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",
最初用于检索身份验证代码的帐户是租户的全局管理员,所以我希望这很好,但我是新手,所以可能是错误的。
有没有人有任何想法? 感谢。
答案 0 :(得分:0)
我假设您已在Azure门户中为您的应用注册设置了相应的权限,而您的问题就是它们未显示在令牌中的原因。
如果您登录的用户之前已同意User.Read
权限,我之前已经在使用Azure v1端点时看到过此行为,然后您更新了门户网站中所需的权限。虽然假设Azure会检测到此更改并重新提示是合乎逻辑的,但事实并非如此。它根据先前记录的同意不断返回令牌,并且不会拿起新的牌。
要处理此问题,您的应用必须在授权阶段在网址上包含prompt=consent
查询参数。这应该在用户登录并获取新权限时强制同意。