如何从Cognito获取用户OAuth2令牌调用Google API的listDirectoryPeople方法
解决Cognito Google登录后获取Google OAuth2令牌调用People API的方案
1. 调整Cognito Google身份提供商配置,直接获取原始令牌
- 进入AWS控制台的Cognito用户池,打开身份提供商下的Google配置页
- 在授权范围中添加
https://www.googleapis.com/auth/directory.readonly(listDirectoryPeople所需权限) - 勾选「返回身份提供商令牌」选项,这样Cognito认证成功后会将Google的Access Token和ID Token返回给前端
- 前端通过Cognito的
getUser()方法获取用户会话,在signInUserSession.idToken.payload.identities数组中找到对应Google身份的access_token字段,直接用该令牌调用People API
2. 利用Cognito联合身份池获取临时访问令牌
- 创建或配置Cognito联合身份池,关联现有用户池作为身份源
- 在联合身份池的身份验证提供程序中启用Google,配置匹配的客户端ID与密钥
- 前端通过Cognito获取用户身份ID后,调用
getCredentialsForIdentity()方法获取包含Google访问令牌的临时凭证 - 确保联合身份池绑定的IAM角色拥有调用Google People API的权限,并配置正确的信任关系
3. 前端静默复用Google会话获取令牌
- 引入Google的
gapi.auth2库,在用户通过Cognito登录后初始化Google Auth实例 - 调用
signInSilently()方法,利用浏览器中已存在的Google会话(因Cognito登录已完成Google授权)静默获取令牌,无需二次弹窗 - 示例代码:
gapi.load('auth2', () => { const auth2 = gapi.auth2.init({ client_id: '你的Google客户端ID', scope: 'https://www.googleapis.com/auth/directory.readonly' }); auth2.signInSilently().then(googleUser => { const accessToken = googleUser.getAuthResponse().access_token; // 调用People API的逻辑 }); });
- 需保证Google客户端ID与Cognito配置一致,且Google Cloud控制台已将当前应用域名加入授权JavaScript源
4. 后端通过Cognito用户信息换取令牌
- 前端将Cognito的ID Token传给后端接口
- 后端调用Cognito的
GetUserAPI,提取用户identities中的Google用户ID - 若Cognito存储了Google刷新令牌,后端可通过Google OAuth2令牌端点,用刷新令牌+客户端凭证换取新的Access Token;若未存储,需提前在Cognito配置中开启刷新令牌存储
内容的提问来源于stack exchange,提问作者Graham
相关产品推荐
相关产品推荐

