在Amplify部署的Next.js中配置CognitoIdentityProviderClient服务端认证
问题:Amplify托管Next.js服务端调用CognitoIdentityProviderClient失败
我在采用Amplify JS库及Amplify托管的Next.js应用中,尝试在服务端使用CognitoIdentityProviderClient。该功能在本地运行完全正常,但部署后客户端无法完成认证与授权。
服务端API代码如下:
import type { NextApiRequest, NextApiResponse } from 'next'; import { getServerSession } from 'next-auth/next'; import errorString from '@/utils/errorString'; import { authOptions } from '@/pages/api/auth/[...nextauth]'; // import { defaultProvider } from '@aws-sdk/credential-provider-node'; import { AdminGetUserCommand, CognitoIdentityProviderClient, } from '@aws-sdk/client-cognito-identity-provider'; import { updatedAwsConfig } from '@/utils/amplify-init'; const handler = async ( req: NextApiRequest, res: NextApiResponse ) => { try { const session = await getServerSession(req, res, authOptions) const { user } = session || {}; const region = updatedAwsConfig.aws_cognito_region; const adminGetUser = async ({ userPoolId, username }) => { const client = new CognitoIdentityProviderClient({ region, // credentials: defaultProvider() }); const command = new AdminGetUserCommand({ UserPoolId: userPoolId, Username: username, }); return client.send(command); }; const userPoolId = updatedAwsConfig.aws_user_pools_id; const username = user.username; const data = await adminGetUser({userPoolId, username}); return res.status(200).json({ data }); } catch(error) { return res.status(500).json({ error: errorString(error) }); } }; export default handler;
推测本地依赖~/.aws/credentials中的凭证,但服务端无此凭证。我已尝试使用@aws-sdk/credential-provider-node的defaultProvider,也为后端角色配置了与本地Amplify相同的IAM角色,但均未解决问题。我需要服务端凭证来调用Admin API,且用户无Amplify会话,请问如何让CognitoIdentityProviderClient正常工作?
解决方案
1. 确认Amplify后端执行角色的IAM权限
- 找到Amplify为你的应用创建的后端执行角色(通常命名格式为
amplify-<应用名>-<环境>-<ID>-backend-role),为其添加针对Cognito Admin API的权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "cognito-idp:AdminGetUser", "Resource": "arn:aws:cognito-idp:<你的AWS区域>:<你的AWS账号ID>:userpool/<你的Cognito用户池ID>" } ] }
- 替换占位符为实际信息,遵循最小权限原则,避免使用通配符
*。
2. 简化Cognito客户端的凭证配置
在Amplify托管环境中,服务端代码会自动获取环境内置的IAM角色凭证,无需手动指定defaultProvider。修改客户端初始化代码:
const client = new CognitoIdentityProviderClient({ region: updatedAwsConfig.aws_cognito_region // 移除credentials配置,SDK会自动从环境获取有效凭证 });
AWS SDK会按优先级从环境变量、IAM角色元数据等位置加载凭证,无需额外配置。
3. 验证会话传递的用户名准确性
- 确认
session.user.username与Cognito用户池中的用户名完全匹配:如果用户是通过邮箱/手机号登录,需确认用户池是否将邮箱/手机号设为用户名,否则要传递用户池存储的实际用户名。 - 可通过本地打印
session.user结构,对比部署后服务端日志中的字段值,确保参数正确。
4. 通过日志定位具体错误
- 登录Amplify控制台,查看对应环境的函数日志(API路由会部署为Lambda函数)或应用日志,获取详细的错误信息(比如权限拒绝、资源不存在、参数错误等),这是快速定位问题的核心步骤。
内容的提问来源于stack exchange,提问作者Роман Коптев
相关产品推荐
相关产品推荐

