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

Angular SSR调用Amplify signIn报错:AuthUserPool未配置

Angular SSR环境下Amplify调用signIn报错AuthUserPoolException: Auth UserPool not configured

我们的Angular项目已启用SSR,服务端调用API需使用token。但在服务端使用Amplify SSR调用signIn方法时,触发错误:AuthUserPoolException: Auth UserPool not configured。

相关代码、依赖及配置

Amplify SSR代码

import { signIn } from '@aws-amplify/auth';
import { CookieStorage, createAWSCredentialsAndIdentityIdProvider, createKeyValueStorageFromCookieStorageAdapter, createUserPoolsTokenProvider, runWithAmplifyServerContext } from 'aws-amplify/adapter-core';
import { parseAmplifyConfig } from 'aws-amplify/utils';
import config from 'src/amplifyconfiguration.json';
import { aws_user } from 'src/environments/environment';

/* get the amplify configuration object */
const amplifyConfig = parseAmplifyConfig(config);


/* create the key-value storage */
const keyValueStorage = createKeyValueStorageFromCookieStorageAdapter({
    get(name) {
        const value = cookieService.get({ key: name });
        return { name, value };
    },
    getAll() {
        const allCookies: CookieStorage.Cookie[] = Object.entries(cookieService.getAll()).map(([name, value]) => ({ name, value }));
        return allCookies;
    },
    set(name, value) {
        cookieService.set({ key: name, value: value });
    },
    delete(name) {
        cookieService.delete({ key: name });
    }
});

/* create token provider */
const tokenProvider = createUserPoolsTokenProvider(
    amplifyConfig.Auth,
    keyValueStorage
);

/* create credentials provider */
const credentialsProvider = createAWSCredentialsAndIdentityIdProvider(
    amplifyConfig.Auth,
    keyValueStorage
);

export async function initSession(): Promise<string> {
    const session = await runWithAmplifyServerContext(
        amplifyConfig,
        {
            Auth: { tokenProvider, credentialsProvider }
        },
        async (contextSpec) => {
            let session;
            try {
                session = await signIn({ username: username, password: password });
            } catch (_) { return `${_}` }
            return `${session.isSignedIn}`;
        },
    );
    return session;
}

Package.json依赖

"dependencies": {
    "@angular/animations": "^17.1.0",
    "@angular/cdk": "^17.0.4",
    "@angular/common": "^17.1.0",
    "@angular/compiler": "^17.1.0",
    "@angular/core": "^17.1.0",
    "@angular/forms": "^17.1.0",
    "@angular/material": "^17.0.4",
    "@angular/platform-browser": "^17.1.0",
    "@angular/platform-browser-dynamic": "^17.1.0",
    "@angular/platform-server": "^17.1.0",
    "@angular/router": "^17.1.0",
    "@angular/service-worker": "^17.1.0",
    "@angular/ssr": "^17.1.2",
    "@auth0/angular-jwt": "^5.1.2",
    "@aws-amplify/cli": "^12.8.2",
    "@aws-amplify/ui-angular": "^5.0.3",
    "@types/crypto-js": "^4.1.2",
    "aws-amplify": "^6.0.6",
    "aws-crt": "^1.20.0",
    "country-flags-svg": "^2.0.0-beta.1",
    "crypto-js": "^4.1.1",
    "express": "^4.18.2",
    "firebase": "^10.7.2",
    "lottie-web": "^5.12.2",
    "ng-event-bus": "^6.0.0",
    "ng-swagger-gen": "^2.3.1",
    "ngx-cookie-service": "^17.0.1",
    "ngx-lottie": "^10.0.0",
    "onesignal-ngx": "^2.0.1",
    "rxjs": "~7.8.0",
    "swiper": "^11.0.5",
    "tslib": "^2.3.0",
    "zone.js": "~0.14.3"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^17.1.2",
    "@angular/cli": "^17.1.2",
    "@angular/compiler-cli": "^17.1.0",
    "@types/express": "^4.17.17",
    "@types/jasmine": "~5.1.0",
    "@types/node": "^18.18.0",
    "jasmine-core": "~5.1.0",
    "karma": "~6.4.0",
    "karma-chrome-launcher": "~3.2.0",
    "karma-coverage": "~2.2.0",
    "karma-jasmine": "~5.1.0",
    "karma-jasmine-html-reporter": "~2.1.0",
    "typescript": "~5.3.2"
  }

AmplifyConfiguration.json配置

{
  "aws_project_region": "region",
  "aws_cognito_identity_pool_id": "identity_pool_id",
  "aws_cognito_region": "region",
  "aws_user_pools_id": "user_pool_id",
  "aws_user_pools_web_client_id": "web_client_id",
  "oauth": {
    "domain": "example.amazoncognito.com",
    "scope": [
      "aws.cognito.signin.user.admin",
      "email",
      "openid",
      "phone",
      "profile"
    ],
    "redirectSignIn": "myapp://callback/",
    "redirectSignOut": "myapp://signout/",
    "responseType": "code"
  },
  "federationTarget": "COGNITO_USER_AND_IDENTITY_POOLS",
  "aws_cognito_username_attributes": [
    "EMAIL"
  ],
  "aws_cognito_social_providers": [
    "FACEBOOK",
    "GOOGLE"
  ],
  "aws_cognito_signup_attributes": [],
  "aws_cognito_mfa_configuration": "OFF",
  "aws_cognito_mfa_types": [],
  "aws_cognito_password_protection_settings": {
    "passwordPolicyMinLength": 8,
    "passwordPolicyCharacters": []
  },
  "aws_cognito_verification_mechanisms": [
    "EMAIL",
    "PHONE_NUMBER"
  ]
}

问题修复方案

1. 直接提取用户池配置传递给Provider

parseAmplifyConfig可能存在解析偏差,导致用户池配置未被正确识别。直接从原始配置中提取关键字段:

// 替换原有amplifyConfig相关代码
const userPoolConfig = {
  userPoolId: config.aws_user_pools_id,
  userPoolClientId: config.aws_user_pools_web_client_id,
  region: config.aws_cognito_region
};

// 创建token provider时传入提取的配置
const tokenProvider = createUserPoolsTokenProvider(
    userPoolConfig,
    keyValueStorage
);

2. 修正runWithAmplifyServerContext的参数结构

确保上下文配置中包含完整的Auth用户池信息:

export async function initSession(): Promise<string> {
    try {
        const session = await runWithAmplifyServerContext(
            {
                Auth: {
                    ...userPoolConfig,
                    tokenProvider,
                    credentialsProvider
                }
            },
            async () => {
                const signInResult = await signIn({ username: aws_user.username, password: aws_user.password });
                return `${signInResult.isSignedIn}`;
            }
        );
        return session;
    } catch (err) {
        return `${err}`;
    }
}

3. 验证服务端配置可用性

在服务端代码中打印userPoolConfig,确认userPoolId、userPoolClientId等字段是否正确读取,避免路径或配置文件加载问题。

4. 升级Amplify依赖版本

当前aws-amplify@6.0.6存在与Angular 17的适配风险,升级到最新稳定版(如v6.1.x)可修复部分已知的SSR配置问题。

内容的提问来源于stack exchange,提问作者John vinith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:16:00