如何在以Azure AD为身份提供商的Cognito中实现客户端凭证流
实现方案
Cognito User Pool 本身只代理面向用户的交互式OAuth流(授权码流、隐式流、密码流等),不支持代理第三方IdP的客户端凭证流,因此不需要尝试让Cognito转发客户端凭证请求到Azure AD,直接走「Azure AD颁发M2M令牌 + 服务侧兼容验证双源令牌」的逻辑即可。
具体实现步骤
- 第一步:在Azure AD注册定时服务的客户端应用
可单独为无值守定时服务注册专属的Azure AD应用(也可以复用现有应用,推荐权限隔离单独注册),进入应用的【证书和密码】板块生成客户端密钥,留存好该应用的客户端ID、客户端密钥、所属Azure AD租户ID。 - 第二步:配置Azure AD侧的应用访问权限
找到之前对接Cognito的Azure AD应用(即提供服务的资源方应用),进入【公开API】板块添加应用权限(注意不要选委托权限,委托权限仅适用于有用户上下文的场景),然后给定时服务的Azure AD应用授予该权限,必须完成管理员同意操作,权限才会生效。 - 第三步:适配Cognito侧的令牌验证规则
打开Cognito用户池配置,进入【App integration】->【Resource servers】,新增资源服务器:- 标识符字段填写资源方Azure AD应用的
Application ID URI - 自定义作用域填写第二步中配置的应用权限名称
同时在服务的现有令牌验证逻辑中,新增对Azure AD颁发令牌的校验规则,两种令牌分开校验:
- 普通用户登录场景下Cognito自颁发的access token:校验issuer为Cognito用户池地址即可,逻辑和现有保持一致
- 服务间调用场景下Azure AD颁发的access token:校验以下核心字段合法性
iss:值为https://sts.windows.net/<你的Azure AD租户ID>/aud:值为资源方Azure AD应用的客户端ID或Application ID URIroles/scp:包含第二步中配置的服务访问权限
- 标识符字段填写资源方Azure AD应用的
- 第四步:定时服务获取令牌发起调用
定时服务直接调用Azure AD的oauth2/token端点,用client_credentials授权类型获取令牌,请求示例:
拿到返回的access token后,放在请求头curl --location --request POST 'https://login.microsoftonline.com/<你的Azure AD租户ID>/oauth2/v2.0/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=<定时服务的Azure AD应用客户端ID>' \ --data-urlencode 'client_secret=<定时服务的Azure AD应用客户端密钥>' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'scope=<资源方Azure AD应用的Application ID URI>/.default'Authorization: Bearer <access_token>中调用目标服务,服务按第三步规则校验通过即可完成鉴权。
简化替代方案(适用于无需打通Azure AD权限体系的场景)
如果你的业务安全规则没有要求服务间调用的权限必须走Azure AD统一管控,可以直接用Cognito原生的机器对机器(M2M)认证能力,完全不需要和Azure AD交互:
- 进入Cognito用户池的【App integration】->【App clients】,新增应用客户端,启用客户端凭证流,生成对应的客户端ID和客户端密钥
- 定时服务直接调用Cognito的
oauth2/token端点,用client_credentials授权类型获取Cognito自颁发的access token - 服务侧的令牌验证逻辑和现有普通用户登录场景完全一致,不需要做任何额外适配
内容的提问来源于stack exchange,提问作者cayman
相关产品推荐
相关产品推荐

