You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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,提问作者Роман Коптев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:32:09