如何在AWS Amplify(Flutter/JS)中实现自定义身份授权并迁移iOS方案
问题描述
在iOS的AWSCore库中,可通过以下方式将自定义第三方认证系统授权至AWS身份池:
let myIdProvider = MyCustomIdProvider() let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USWest2, identityProvider: myIdProvider) let configuration = AWSServiceConfiguration(region: AWSRegionType.USWest2, credentialsProvider:credentialsProvider)! // 后续可用于S3等服务访问... // 自定义身份提供者类... class MyCustomIdProvider : AWSCognitoCredentialsProviderHelper { override func token() -> AWSTask<NSString> { // 在此处完成验证逻辑 } }
现需将该实现迁移至跨平台方案(优先选择Dart/Flutter,也可接受JS方案),如何在Amplify中实现此需求?
Flutter/Dart 实现方式
Amplify Flutter支持通过自定义身份提供者对接AWS身份池,核心是实现自定义凭证获取逻辑,步骤如下:
- 配置Amplify Auth
在amplifyconfiguration.dart中配置身份池,需与AWS控制台中自定义提供者名称保持一致:
const amplifyconfig = '''{ "auth": { "plugins": { "awsCognitoAuthPlugin": { "IdentityManager": { "Default": {} }, "CredentialsProvider": { "CognitoIdentity": { "Default": { "PoolId": "YOUR_IDENTITY_POOL_ID", "Region": "us-west-2" } } }, "CognitoIdentityProvider": { "Default": { "Region": "us-west-2", "UserPoolId": "", // 自定义提供者无需用户池,留空 "ClientId": "" } }, "Auth": { "Default": { "authenticationFlowType": "CUSTOM_AUTH" } } } } } }''';
- 实现自定义身份获取逻辑
先调用第三方认证系统获取token,再传递给AWS身份池获取临时凭证:
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart'; import 'package:amplify_flutter/amplify_flutter.dart'; // 获取第三方认证系统的token Future<String> getCustomAuthToken() async { // 替换为你的第三方认证接口调用逻辑 // final response = await http.post(Uri.parse('YOUR_AUTH_ENDPOINT'), body: {...}); // return response.data['token']; return "YOUR_CUSTOM_AUTH_TOKEN"; } // 初始化Amplify并获取AWS凭证 Future<void> setupCustomAuth() async { await Amplify.addPlugin(AmplifyAuthCognito()); await Amplify.configure(amplifyconfig); final customToken = await getCustomAuthToken(); // 使用自定义token获取AWS身份池凭证 final credentialsProvider = CognitoCredentialsProvider( identityPoolId: 'YOUR_IDENTITY_POOL_ID', region: 'us-west-2', customProvider: (_) async => customToken, ); // 后续使用Amplify的S3等服务时,会自动使用该凭证 }
- AWS控制台配置
在AWS身份池控制台中启用「自定义身份提供者」,设置与代码中匹配的提供者名称,并配置token验证规则(如签名校验或后端接口验证)。
JavaScript(Web/Node.js)实现方式
Amplify JS同样支持自定义身份提供者对接,步骤如下:
- 配置Amplify
在amplifyconfiguration.json中配置身份池和自定义提供者:
{ "auth": { "identityPoolId": "YOUR_IDENTITY_POOL_ID", "region": "us-west-2", "authenticationFlowType": "CUSTOM_AUTH", "customProvider": "YOUR_CUSTOM_PROVIDER_NAME" } }
- 实现自定义认证逻辑
获取第三方token后,通过federatedSignIn对接AWS身份池:
import { Amplify, Auth } from 'aws-amplify'; import amplifyconfig from './amplifyconfiguration.json'; Amplify.configure(amplifyconfig); // 获取第三方认证token async function getCustomAuthToken() { // 替换为你的第三方认证接口调用逻辑 // const response = await fetch('YOUR_AUTH_ENDPOINT', { method: 'POST', body: ... }); // const data = await response.json(); // return data.token; return "YOUR_CUSTOM_AUTH_TOKEN"; } // 完成自定义认证并获取AWS凭证 async function signInWithCustomProvider() { const customToken = await getCustomAuthToken(); await Auth.federatedSignIn({ provider: 'YOUR_CUSTOM_PROVIDER_NAME', token: customToken }); // 获取AWS临时凭证 const credentials = await Auth.currentCredentials(); // 后续可用于S3等服务访问 }
- AWS控制台配置
与Flutter方案一致,在身份池控制台启用自定义身份提供者,设置匹配的名称和验证规则。
内容的提问来源于stack exchange,提问作者Quinn Frederick
相关产品推荐
相关产品推荐

