Android 使用 AWS Cognito、Google+ OAuth 和 AccountManager 的应用程序

Android App using AWS Cognito, Google+ OAuth, and AccountManager

我一直在尝试在我的 Android 应用程序上设置 Google+ OAuth 和 AWS Cognito。我相信现在我有 Google+ OAuth 工作,因为我可以在下面的电话中取消帐户:

GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);

从该结果对象中,我可以获得以下概述的某些数据:

   if (result.isSuccess()) {

    GoogleSignInAccount account = result.getSignInAccount();
    String authCode = account.getServerAuthCode(); //null
    String displayName =account.getDisplayName(); //correct value
    String email = account.getEmail(); //correct value
    String id = account.getId(); //correct value
    String idToken = account.getIdToken(); //null
...

但是,当我按照 AWS 的文档进行操作时,我遇到了错误和弃用的方法。这是我试图从 AWS 的文档中模仿的代码块:

文档:http://docs.aws.amazon.com/cognito/latest/developerguide/google.html#set-up-google-1.android#Android

//From Documentation ^ 
GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
    AccountManager am = AccountManager.get(this);
    Account[] accounts = am.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
    String token = GoogleAuthUtil.getToken(getApplicationContext(), accounts[0].name,
            "audience:server:client_id:YOUR_GOOGLE_CLIENT_ID");
    Map<String, String> logins = new HashMap<String, String>();
    logins.put("accounts.google.com", token);
    credentialsProvider.setLogins(logins);

这是我 运行 遇到的问题:

AccountManager am = AccountManager.get(context);
            Account[] accounts = am.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);

调用 accounts 之后是一个空数组——我需要做些什么来确保 OAuth 进程将信息放入 AccountManager 中吗?

*** 我不确定的另一件事是,AWS 文档(来自上面的 link)在设置 google 的步骤 #5 中指出我应该执行以下操作我似乎无法正确执行的步骤:"Under Credentials > Add Credentials, create a Service Account. The console will alert you that a new public/private key has been created."

Google 已更改其 UI,现在有 3 个选项,创建自定义服务帐户,并使用两个默认帐户之一(应用引擎/计算引擎)。我该怎么做?

好的,我明白了。 Amazon aws 和 google 文档的主要更改。

  1. GoogleSignInOptions 需要请求 ID 令牌。你这样做:

    googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestScopes(new Scope(Scopes.PLUS_LOGIN)) //<- this is optional
            //requestIdToken takes the google cloud console's project's WEB (not Android)
            .requestIdToken("in this string put your google web client id")
            .requestEmail()
            .build();
    
  2. 然后当你得到结果时你将拥有 id 令牌

    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    GoogleSignInAccount account = result.getSignInAccount();
    String idToken = account.getIdToken();
    
  3. 现在您可以使用该 id 令牌通过 cognito 获取 aws 凭据。

    映射登录 = new HashMap(); logins.put("accounts.google.com", 令牌); credentialsProvider.setLogins(登录); //credentialsProvider=CognitoCachingCredentialsProvider

现在你应该准备好了。