如何在Unity中通过Google登录获取AWS Cognito ID Token(无需外部浏览器)
解决方案:Unity内通过Google登录获取AWS Cognito ID Token(无外部浏览器)
核心思路是用Google Unity SDK获取Google ID Token,再通过Cognito API将其交换为Cognito ID Token,全程在App内完成,无需托管UI或外部浏览器跳转。
步骤1:配置Google OAuth客户端
- 登录Google Cloud控制台,创建对应Unity目标平台(Android/iOS)的OAuth 2.0客户端ID
- Android:填写Unity打包时使用的SHA-1指纹和应用包名
- iOS:填写应用Bundle ID
- 确保Google客户端的授权范围包含
openid、email、profile(Cognito验证需要这些字段)
步骤2:集成Google Sign-In Unity SDK
- 导入Google Sign-In SDK到Unity项目,在设置面板填入步骤1创建的客户端ID
- 调用Google登录API获取ID Token,核心代码示例:
using GoogleSignIn; public async void GoogleLogin() { var signIn = GoogleSignIn.DefaultInstance; signIn.Configuration = new GoogleSignInConfiguration { ClientId = "你的Google客户端ID", RequestIdToken = true // 必须开启,才能获取ID Token }; try { var user = await signIn.SignInAsync(); string googleIdToken = user.IdToken; // 拿到Google ID Token后,进入Cognito交换流程 await ExchangeGoogleTokenForCognitoIdToken(googleIdToken); } catch (Exception e) { Debug.LogError($"Google登录失败: {e.Message}"); } }
步骤3:配置AWS Cognito用户池
- 在AWS控制台打开目标用户池,添加Google作为身份提供商:
- 填入Google客户端ID和客户端密钥
- 设置授权范围为
openid email profile
- 找到用户池的App客户端,确保:
- 未启用托管UI
- 允许的认证流程包含
AUTHENTICATION_TOKEN_AUTH(或CUSTOM_AUTH,视版本而定) - 如果是移动App客户端,建议禁用客户端密钥(避免硬编码风险)
步骤4:Unity内调用Cognito API交换ID Token
- 导入AWS SDK for Unity,配置Cognito用户池ID、App客户端ID和区域
- 编写代码将Google ID Token传给Cognito,获取Cognito ID Token:
using Amazon.CognitoIdentityProvider; using Amazon.CognitoIdentityProvider.Model; using Amazon.Runtime; public async Task ExchangeGoogleTokenForCognitoIdToken(string googleIdToken) { var credentials = new AnonymousAWSCredentials(); var client = new AmazonCognitoIdentityProviderClient(credentials, Amazon.RegionEndpoint.你的Cognito区域); var request = new InitiateAuthRequest { ClientId = "你的Cognito App客户端ID", AuthFlow = AuthFlowType.AuthenticationTokenAuth, // 指定用第三方Token认证 AuthParameters = new Dictionary<string, string> { { "TOKEN", googleIdToken } // 传入Google的ID Token } }; try { var response = await client.InitiateAuthAsync(request); string cognitoIdToken = response.AuthenticationResult.IdToken; Debug.Log($"获取Cognito ID Token成功: {cognitoIdToken}"); // 后续可使用此ID Token进行Cognito相关操作 } catch (Exception e) { Debug.LogError($"交换Token失败: {e.Message}"); } }
关键注意事项
- Google ID Token必须与Cognito中配置的Google身份提供商客户端ID匹配,否则Cognito会拒绝验证
- Unity打包时,Android的SHA-1、iOS的Bundle ID必须与Google Cloud控制台配置完全一致,否则Google登录会报错
- AWS SDK区域必须与Cognito用户池所在区域一致
- 避免在Unity代码中硬编码敏感信息(如Google客户端密钥、Cognito客户端密钥),移动App建议使用无客户端密钥的App客户端
内容的提问来源于stack exchange,提问作者MayQuartet
相关产品推荐
相关产品推荐

