azure 为什么AuthorizationCodeRequest和AuthorizationCodeUrlRequest的作用域可以不同,尽管文档中另有说明?

gzszwxb4  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(75)

我刚刚开始探索MS身份平台,偶然发现了这个example repo用于节点Web应用程序。在其中,在 App〉routes〉auth.js 下,/aquireToken路由设置了authCodeUrlRequestParamsauthCodeRequestParams。这包括redirectToAuthCodeUrl()函数中的请求dont的范围。我想知道这两个参数对象是如何工作的,偶然发现了这个页面,它说
确保AuthorizationCodeUrlRequestAuthorizationCodeRequest中redirectUri和scopes的值相同
当然,我在不使用相同作用域的情况下尝试了这个方法,并注意到它仍然可以工作。(例如 Calendars.Read)但不是authCodeRequestParams,应用程序仍然工作,我可以访问受此范围保护的数据。切换范围时请求失败(这是有道理的,因为auth URL不包括丢失的作用域)。但是,为什么当作用域包含在auth URL中而不是请求对象中时,它会工作呢?

p8h8hvxi

p8h8hvxi1#

正如我们所知,authCodeUrlRequestParams用于生成认证代码,我们可以使用AAD auth code flow使用认证代码生成访问令牌。
我之前做过一个测试,你可以看到Files.ReadWrite.All是一个不需要管理员同意的范围。

所以在没有管理员同意的情况下添加了这个API权限,并且我在生成auth代码时没有添加这个范围,而是在生成访问令牌时添加了它,它给了我一个错误。

但是如果我在生成授权代码时添加了Files.ReadWrite.All,由于此范围没有管理员同意,我会在使用我的帐户登录后看到一个用户同意弹出窗口,允许我同意此应用程序具有某些权限。我同意权限并获得授权代码,然后我使用此代码可以获得一个访问令牌,其中包含scp声明中的Files.ReadWrite.All

顺便说一句,在上面的截图中,你可以看到我只在请求中设置了User.Read,但是我得到的范围远远不止一个User.Read,其他的范围都来自auth代码。我设置了范围profile email openid offline_access用于生成auth代码。
所以我的观点是,我们必须包含不需要管理员同意的范围,并且还没有得到管理员同意,但我们在authCodeUrlRequestParams中需要,这样我们就可以为这个范围给予用户同意,即使我们没有在authCodeRequestParams中设置它,我们也可以使用代码生成包含这个范围的访问令牌。
如果我们需要的范围已经得到了管理员的同意,无论它是否需要管理员的同意,我们都不需要在authCodeUrlRequestParams中添加它,只需要在authCodeRequestParams中添加它,我们就可以获得正确的访问令牌。下面的截图,Group.Read.All已经得到了管理员的同意。

这些都是基于我的测试。

相关问题