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
相关产品推荐
相关产品推荐

