如何用Keycloak获取的访问令牌调用Microsoft Graph API?
解决Keycloak 21.1.1集成Azure AD访问Microsoft Graph API的方案
1. 确认Azure AD应用的权限配置(关键前置)
- 确保Azure AD应用已添加Delegated权限(用户上下文访问Graph需用此类型),比如
Mail.Read、Mail.Write,并且已完成管理员同意(租户级应用必须操作)。 - 匹配Keycloak的客户端类型:若Azure应用是机密客户端,需保存客户端密钥;若是公共客户端,确保应用设置中允许公共客户端流。
2. 调整Keycloak Azure AD身份提供商(IDP)配置
进入Keycloak后台,找到已创建的Azure AD OIDC IDP并编辑:
- 配置标签页:根据Azure应用类型勾选
Client Authentication,机密客户端需填入正确的客户端密钥。 - 高级标签页:将
Use JWT from response设为On,确保Keycloak能获取Azure返回的原始令牌。 - 范围字段:填入
openid email profile Mail.Read Mail.Write(必须包含openid作为OIDC基础范围,后续追加所需的Graph权限)。
3. 配置Keycloak客户端的令牌映射(传递Azure访问令牌)
找到你的业务应用对应的Keycloak客户端,进入客户端范围标签:
- 添加与Azure AD IDP关联的客户端范围,或直接创建自定义范围:
- 新建客户端范围,类型选
User Attribute,关联到Azure AD IDP。 - 新增
IDP Access Token映射器:- 名称自定义(如
Azure AD Access Token) - 映射器类型选
IDP Access Token - 勾选
添加到访问令牌(若需ID令牌携带则同时勾选) - 声明名称可保留默认
idp.access_token或自定义为azure_access_token
- 名称自定义(如
- 新建客户端范围,类型选
4. 验证与调试
- 用户登录后,从Keycloak获取的访问令牌中,应能找到对应声明(如
idp.access_token),其值即为Azure颁发的带Graph权限的访问令牌。 - 用该令牌调用Graph API(如
GET https://graph.microsoft.com/v1.0/me/messages),验证是否能正常返回数据。
常见问题排查
- 找不到Azure访问令牌:检查Keycloak IDP的
Use JWT from response是否开启,以及客户端映射器是否启用。 - Graph API返回权限不足:确认Azure应用的权限已完成管理员同意,且Keycloak IDP的范围字段包含所需权限。
- Keycloak获取Azure令牌失败:核对Azure应用的重定向URI是否与Keycloak IDP回调地址(格式:
https://<keycloak-domain>/realms/<realm-name>/broker/azure-ad/endpoint)完全匹配,客户端密钥是否正确。
内容的提问来源于stack exchange,提问作者Adithya
相关产品推荐
相关产品推荐

