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