NodeJS后端无Amplify实现Google与Cognito身份认证对接
我在查找无需Amplify、通过后端处理Google回调redirectUri的code来完成Google用户与Cognito用户池应用客户端认证的文档或示例时遇到问题。当前流程为:前端点击Google登录按钮,选择邮箱后重定向至Express后端的/google/callback路由,该路由代码如下:
// google callback redirect uri express route router.get('/google/callback', function(req, res, next) { const { code } = req.query as string; const { tokens } = await googleAuthClient.getToken(req.query.code); const idToken = tokens.id_token; const ticket = await googleClient.verifyIdToken({ idToken: idToken, audience: GOOGLE_CLIENT_ID }); const payload = ticket.getPayload(); const userid = payload['sub'];我已通过该代码获取Google的idToken并验证,拿到用户信息。尝试使用AWS SDK的CognitoIdentityServiceProvider调用initiateAuth,测试不同AUTH_FLOW但未成功,因用户通过Google登录无密码,不清楚应使用哪种AUTH_FLOW及所需参数。我希望不使用前端Amplify和Cognito托管UI,仅通过后端完成认证。已知Google账号已与Cognito账号关联,请问如何利用现有流程中的信息完成Cognito认证并获取accessToken?
解决方案
你需要使用CognitoIdentityServiceProvider的initiateAuth方法,选择CUSTOM_AUTH作为认证流程,结合已获取的Google idToken完成认证,具体步骤如下:
核心配置与参数说明
- AuthFlow: 指定为
CUSTOM_AUTH,该流程支持自定义凭证验证,适配第三方IDP的token认证场景 - AuthParameters: 需传递两个关键参数:
USERNAME: Cognito用户池中的用户名(可使用关联的Google邮箱,前提是Cognito用户的用户名设置为邮箱)GOOGLE_ID_TOKEN: 你已从Google获取并验证的idToken
- ClientId: 你的Cognito用户池应用客户端ID
完整代码示例
在你的Express回调路由中补充Cognito认证逻辑:
const { CognitoIdentityServiceProvider } = require('@aws-sdk/client-cognito-identity-provider'); // 初始化Cognito客户端 const cognitoClient = new CognitoIdentityServiceProvider({ region: '你的AWS区域(如us-east-1)' }); router.get('/google/callback', async function(req, res, next) { // 原有Google认证逻辑 const { code } = req.query; const { tokens } = await googleAuthClient.getToken(code); const idToken = tokens.id_token; const ticket = await googleClient.verifyIdToken({ idToken: idToken, audience: GOOGLE_CLIENT_ID }); const payload = ticket.getPayload(); const userEmail = payload['email']; // 假设Cognito用户用户名关联邮箱 // Cognito认证逻辑 try { const authResponse = await cognitoClient.initiateAuth({ ClientId: '你的Cognito应用客户端ID', AuthFlow: 'CUSTOM_AUTH', AuthParameters: { USERNAME: userEmail, GOOGLE_ID_TOKEN: idToken } }); // 提取并返回Cognito认证凭证 const { AccessToken, IdToken, RefreshToken } = authResponse.AuthenticationResult; res.json({ accessToken: AccessToken, idToken: IdToken, refreshToken: RefreshToken }); } catch (err) { console.error('Cognito认证失败:', err); res.status(500).json({ error: '认证失败,请检查配置' }); } });
注意事项
- 若你的Cognito应用客户端启用了客户端密钥,需在
initiateAuth参数中添加SecretHash,计算方式为:用HMAC-SHA256哈希USERNAME + ClientId,密钥为客户端密钥 - 若后端具备管理员权限,也可使用
adminInitiateAuth方法,此时需添加UserPoolId参数,且无需传递SecretHash - 确保Google身份提供商已正确配置到Cognito用户池,且当前Google账号已与Cognito用户完成关联
内容的提问来源于stack exchange,提问作者user6680
相关产品推荐
相关产品推荐

