Amazon Cognito是一个完整的身份验证和用户管理服务,但如果您希望使用Authing作为替代方案,同时保持AWS API Gateway的JWT验证功能,以下是详细的实现步骤。
创建Authing应用:
配置JWT设置:
获取必要信息:
应用ID
(作为JWT的aud
声明)Issuer URL
(通常是https://{your-domain}.authing.cn/oidc
)创建JWT Authorizer:
aws apigateway create-authorizer \
--rest-api-id YOUR_API_ID \
--name AuthingAuthorizer \
--type JWT \
--identity-source '$request.header.Authorization' \
--jwt-configuration \
'{
"issuer": "https://YOUR_AUTHING_DOMAIN.authing.cn/oidc",
"audience": ["YOUR_AUTHING_APP_ID"],
"jwksUri": "https://YOUR_AUTHING_DOMAIN.authing.cn/oidc/jwks"
}'
或通过AWS控制台:
安装Authing SDK:
npm install @authing/web
初始化Authing客户端:
import { Authing } from '@authing/web';
const authing = new Authing({
appId: 'YOUR_AUTHING_APP_ID',
host: 'https://YOUR_AUTHING_DOMAIN.authing.cn',
redirectUri: 'https://your-app.com/callback'
});
登录并获取JWT:
// 跳转到Authing登录页面
authing.login();
// 处理回调后获取token
const token = await authing.getAccessToken();
// 调用API时携带token
fetch('https://your-api.execute-api.region.amazonaws.com/prod/endpoint', {
headers: {
'Authorization': `Bearer ${token}`
}
});
如果需要在Lambda中进一步验证JWT:
const jwt = require('jsonwebtoken');
const jwksClient = require('jwks-rsa');
const client = jwksClient({
jwksUri: 'https://YOUR_AUTHING_DOMAIN.authing.cn/oidc/jwks'
});
function getKey(header, callback) {
client.getSigningKey(header.kid, (err, key) => {
callback(null, key.getPublicKey());
});
}
exports.handler = async (event) => {
const token = event.headers.Authorization.split(' ')[1];
try {
const decoded = await new Promise((resolve, reject) => {
jwt.verify(token, getKey, {
audience: 'YOUR_AUTHING_APP_ID',
issuer: 'https://YOUR_AUTHING_DOMAIN.authing.cn/oidc',
algorithms: ['RS256']
}, (err, decoded) => {
if (err) reject(err);
else resolve(decoded);
});
});
// 验证通过,处理请求
return {
statusCode: 200,
body: JSON.stringify({ message: 'Authenticated', user: decoded.sub })
};
} catch (err) {
return {
statusCode: 401,
body: JSON.stringify({ error: 'Unauthorized' })
};
}
};
Cognito特有功能替代:
迁移考虑:
性能考虑:
成本比较:
通过以上步骤,您可以成功用Authing替换Cognito,同时保持API Gateway的JWT验证功能。