Azure OAuth登录-曾经可用,现在出现AADSTS700022 / AADSTS700023错误

6
我们的网站已经使用Office 365登录几个月了,但突然出现了问题。今天早晨(英国时间),当我们通过https://login.microsoftonline.com/common/oauth2/v2.0/token请求令牌时,出现了“AADSTS700023:在使用提供的授权代码请求访问令牌时,输入参数范围的提供值不能为空。请指定有效的范围。”的错误。
根据文档显示,需要传递范围(scope),否则会出现此错误。即使它已经工作了几个月,我也添加了它。现在我得到了不同的错误。
"AADSTS700022: 提供的输入参数范围的值无效,因为它包含多个资源。范围 https://outlook.office.com/mail.send mail.readwrite calendars.readwrite tasks.readwrite contacts.readwrite openid profile offline_access 是无效的."
当我们首先调用授权端点时,这就是传递的范围,并且从该调用中正常返回,但是当我们尝试获取令牌时,它失败了。
目前,365是否存在一般性的登录问题,还是我做错了什么,微软已经决定“修复”他们的端口?
2个回答

5
AADSTS700023: 提供的输入参数scope的值为空,因此无法使用提供的授权码请求访问令牌。请指定有效的范围。
在Azure AD V2.0中获取访问资源的令牌时,您需要指定"scope"参数,该参数指示应用程序请求授权的资源和权限。请参阅Azure AD v2.0中的OAuth 2.0 Authorization Code Flow works
AADSTS700022: 提供的输入参数scope的值无效,因为它包含多个资源。范围https://outlook.office.com/mail.send mail.readwrite calendars.readwrite tasks.readwrite contacts.readwrite openid profile offline_access是无效的。
从Azure AD发出的访问令牌仅适用于一个资源,您不能使用相同的令牌访问多个资源。这意味着您应该在令牌请求中指定一个资源的范围。查看您的范围:
  • https://outlook.office.com/mail.send 是 Office 365 统一邮件 API 的范围。
  • mail.readwrite calendars.readwrite tasks.readwrite contacts.readwrite 是 Microsoft Graph API 的范围。

您无法获取访问两个资源的访问令牌。您可以请求 Mail.Send 范围,以使用 Microsoft Graph API 发送电子邮件,而不是使用 O365 邮件 REST API 的范围。


1
但是为什么这个已经运行了几个月突然就停止工作了呢?我们需要访问两个API,因为通过Graph发送电子邮件有一个严格的附件大小限制,而我们需要访问Graph API来处理传入的邮件。此外,我要重申的是,这是在Token阶段,我们已经成功地通过了授权步骤,并结合了该组合范围。 - Steve Childs
“哦,原来如此,这是否意味着我们可以在授权阶段使用组合范围,但现在需要为每个范围获取多个令牌?我们不再发送一个令牌请求,而是发送两个请求,一个用于 Office 365 邮件 API(即 https://outlook.office.com/mail.send),另一个用于 Graph API(mail.readwrite calendars.readwrite tasks.readwrite contacts.readwrite)?然后我们将存储这两个令牌,并在调用 Graph 或 Office 365 API 时根据需要使用它们?我想用户不必再次授权,因为授权范围已经覆盖了两者?” - Steve Childs
完全正确,史蒂夫。所以在过去,您将 scope=https://outlook.office.com/mail.send mail.readwrite calendars.readwrite tasks.readwrite contacts.readwrite openid profile offline_access 发送到授权端点,并且在令牌端点没有使用 scope 参数?您是否使用此访问令牌调用了哪些 API? - dstrockis
1
@dstrockis - 说得完全正确。目前我们只在使用Outlook发送邮件的api调用,在开发中,我们正在使用Graph API监视收件箱中的电子邮件。然而,现场系统已经崩溃了,所有这些都是要求上述范围,然后获得没有范围的令牌。正如我所说,这已经运作了大约2-3个月! - Steve Childs
2
最终解决了,我的假设是正确的。使用代码获取图形 API(或 Outlook,但我首先选择了图形)的令牌,然后使用其中的刷新令牌值获取 Outlook API 的令牌。 - Steve Childs
显示剩余3条评论

2
答案如南宇所说,由于某种原因,过去几个月调用一直有效,但现在无法获得涵盖多个资源(即 Graph 和 Outlook API)的令牌。 解决方案是请求同时覆盖两个 API 的身份验证,然后为 Graph 和 Outlook API 请求单独的令牌并将其分别存储。当进行 API 调用时,检测使用的是哪个 API 并传递相应的令牌。请注意保留 HTML 标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接