问题描述: 在使用Amazon负载均衡器和Cognito进行身份验证的过程中,当用户成功登录后,返回401错误。
解决方法:
确保Cognito用户池正确配置了域名和回调URL。在Cognito控制台中,导航到“应用客户端设置”选项卡,确保“回调URL”和“登出URL”正确设置为Amazon负载均衡器的URL。
确保Amazon负载均衡器的目标组已配置为接收来自Cognito的健康检查请求。在目标组的“健康检查”选项卡中,确认“协议”设置为HTTP,端口与Cognito的域名端口匹配,并且路径与Cognito的健康检查路径匹配。例如,如果Cognito的域名是example.auth.us-west-2.amazoncognito.com,健康检查路径设置为/。
确保Amazon负载均衡器的目标组已配置为将身份验证请求转发给Cognito。在目标组的“目标组属性”选项卡中,确认“目标类型”设置为“IP”,“端口”设置为Cognito的端口,并在“高级路由”中创建一个规则,将路径/转发到Cognito的域名。例如,Cognito的域名是example.auth.us-west-2.amazoncognito.com,路径设置为/。
以下是一个示例代码片段,展示了如何使用Node.js和Express框架来处理Amazon负载均衡器与Cognito的身份验证:
const express = require('express');
const AWS = require('aws-sdk');
const AmazonCognitoIdentity = require('amazon-cognito-identity-js');
const app = express();
// 配置Cognito用户池信息
const poolData = {
UserPoolId: 'your_user_pool_id',
ClientId: 'your_client_id'
};
const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
// 身份验证中间件
app.use((req, res, next) => {
const { Authorization } = req.headers;
// 检查Authorization头是否存在
if (!Authorization) {
return res.status(401).json({ message: 'Unauthorized' });
}
// 解析Token中的用户名
const accessToken = Authorization.split(' ')[1];
const accessTokenJwt = AWS.CognitoIdentityServiceProvider.CognitoAccessToken(accessToken);
const username = accessTokenJwt.payload.username;
// 使用Cognito SDK验证Token
const cognitoUser = new AmazonCognitoIdentity.CognitoUser({ Username: username, Pool: userPool });
cognitoUser.getSession((error, session) => {
if (error) {
return res.status(401).json({ message: 'Unauthorized' });
}
// 验证成功,将用户信息存储在req对象中
req.user = {
username: session.idToken.payload.username
};
next();
});
});
// 受保护的路由示例
app.get('/protected', (req, res) => {
res.json({ message: 'Protected route', user: req.user });
});
app.listen(3000, () => {
console.log('Server started on port 3000');
});
在上述代码中,我们使用了amazon-cognito-identity-js库来处理Cognito的身份验证。在中间件中,我们通过解析Authorization头中的Token来获取用户名,并使用Cognito SDK进行Token验证。如果验证成功,我们将用户信息存储在req.user对象中,并继续处理请求。如果验证失败,我们返回401错误。
请确保替换代码中的your_user_pool_id和your_client_id为您自己的Cognito用户池ID和客户端ID。
希望以上解决方法对您有所帮助!