关于Azure Function复用AAD转发的Bearer Token调用Microsoft Graph的疑问
我开发了基于TypeScript/JavaScript的SharePoint Online SPFx Web部件,该部件调用Azure Function时,Azure AD会转发部分请求头,示例如下:
.. authorization: "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LSTNRO.........", .. .. x-ms-client-principal: "eyJhdXRoX3R5cCI6ImFhZCIsImNsYWltcyI6W3sidHlwIjoiYXVkI..........", x-ms-client-principal-id: "588301bd-048a-XXXX-XXXX-XXXX-XXXX", x-ms-client-principal-idp: "aad", x-ms-client-principal-name: "me@example.com", ..
针对这些请求头,以下是相关疑问的解答:
1. 上述authorization(Bearer)令牌的具体用途是什么?
这个Bearer令牌是SPFx Web部件用来验证自身有权限调用Azure Function的凭证,本质是AAD颁发给SPFx应用的访问令牌。它的核心作用是让Azure Function确认请求来自经过授权的SPFx应用,同时附带了当前登录用户的身份信息,但令牌的受众(audience)是你的Azure Function,而非其他服务。
2. 该authorization(Bearer)令牌是否为delegated token?能否以登录用户的有效令牌身份,用于调用Microsoft Graph的delegated接口(如https://graph.microsoft.com/v1.0/me)?
它属于委托令牌,但不能直接用来调用Microsoft Graph的委托接口。原因有两点:一是这个令牌的受众(aud字段)是你的Azure Function,而非Microsoft Graph,Graph服务会校验令牌受众,不匹配会直接拒绝请求;二是令牌内的权限范围(scp字段)仅针对Azure Function,不包含任何Microsoft Graph相关的权限。
3. 若问题2答案为否,上述AAD转发的用户令牌/主体中,哪一个可用于调用Microsoft Graph的delegated接口?
x-ms-client-principal是经过Base64编码的用户主体信息,但它不是可直接使用的访问令牌。你需要在Azure Function中,基于这个用户主体信息,通过AAD的On-Behalf-Of(OBO)流程,向AAD申请针对Microsoft Graph的委托访问令牌。执行这个流程需要你的Azure Function提前配置好对应的权限,申请时要带上原SPFx的Bearer令牌以及所需的Graph权限范围。
4. 若上述令牌/主体均无法用于delegated调用,是否意味着从Azure Function调用Microsoft Graph只能采用application permissions方式?
不是的。除了应用权限(application permissions),你可以通过On-Behalf-Of(OBO)流程获取用户委托的Graph令牌,以此以登录用户的身份调用Graph的委托接口。应用权限是用Azure Function自身的身份发起调用,无需用户上下文;而OBO流程则是借用当前登录用户的身份,要求用户已经完成登录并授权过相关权限。
内容的提问来源于stack exchange,提问作者夏期劇場

