基于Google身份提供商的AWS Cognito用户/身份池认证问题咨询
先给你点个赞——你已经成功基于AWS Amplify实现了Google联合登录到Cognito的流程,拿到了完整的CognitoIdentityCredentials,这本身就是个不错的成果!针对你提出的三个问题,我来逐一拆解:
问题1:是否可通过缺失的Babel插件减小该体积?
Babel插件主要负责语法转译,对第三方库的体积优化作用非常有限——毕竟你已经做了webpack的压缩、混淆和全量优化。你提到的Amplify单例模式确实会让Tree Shaking难以完全生效,但有个更直接有效的优化方式:使用AWS Amplify v6+的模块化导入。
以前的import Amplify from 'aws-amplify'会引入整个库,而v6版本支持按需导入核心模块,比如只引入Auth相关功能:
import { Amplify } from 'aws-amplify'; import { Auth } from 'aws-amplify/auth';
这样webpack只会打包Auth相关的代码,能大幅降低打包体积,效果比找Babel插件要直接得多。如果还在用旧版本Amplify,建议升级到v6,它本身就是为减小打包体积重构的。
问题2:当前实现是否过于复杂,是否有更稳健的方案?
你的手动加载Google API脚本、初始化gapi的流程确实有点繁琐,其实Amplify本身已经内置了OAuth联合登录的完整支持,完全可以简化流程,不用自己处理Google SDK的细节。
具体做法是在Amplify配置中加入OAuth相关参数,让Amplify自动处理所有登录逻辑:
Amplify.configure({ Auth: { identityPoolId: '你的身份池ID', region: '你的区域', userPoolId: '你的用户池ID', userPoolWebClientId: '你的应用客户端ID', oauth: { domain: '你的Cognito用户池域名', // 比如xxx.auth.us-east-1.amazoncognito.com scope: ['profile', 'email', 'openid'], redirectSignIn: 'http://localhost:8080', redirectSignOut: 'http://localhost:8080', responseType: 'token' // 可选'code',根据你的授权流程需求选择 } } });
之后直接调用Auth.federatedSignIn({ provider: 'Google' })就能触发Google登录流程,Amplify会自动处理跳转、回调、token获取并生成Cognito凭证。整个流程由Amplify维护,比手动写gapi逻辑更稳健,也更少出错。
问题3:能否使用体积更小的旧方案amazon-cognito-identity-js实现该认证?
完全可以!虽然官方文档里联合登录的例子不多,但核心逻辑是用Google SDK拿到id_token后,结合amazon-cognito-identity-js和AWS SDK的CognitoIdentityCredentials来获取凭证,具体步骤如下:
- 保持你现有步骤4的逻辑:通过Google SDK获取
id_token; - 只引入必要的模块(避免加载全量AWS SDK):
import { CognitoIdentityCredentials } from 'aws-sdk/clients/cognitoidentity';
- 创建凭证实例并获取有效凭证:
const credentials = new CognitoIdentityCredentials({ IdentityPoolId: '你的身份池ID', Logins: { 'accounts.google.com': id_token // 这个key是Google身份提供商的固定标识 } }); // 获取凭证 await credentials.getPromise(); // 之后就可以用credentials.accessKeyId、credentials.secretAccessKey、credentials.sessionToken调用AWS服务了
这种方式的打包体积会小很多,因为你只引入了必要的功能模块,没有加载整个Amplify库。需要注意的是,要确保你的身份池已经配置了Google作为联合身份提供商(和你之前的步骤6一致)。
内容的提问来源于stack exchange,提问作者ZenMaster

