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

标签 android oauth google-plus amazon-cognito 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 文档(来自上面的链接)在设置 google 的第 5 步中指出我应该执行以下我似乎无法正确执行的步骤: "在 Credentials > Add Credentials 下,创建一个服务帐户。控制台将提醒您已创建新的公钥/私钥。"

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

最佳答案

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

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

    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 token

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

    Map logins = new HashMap(); logins.put("accounts.google.com", token); credentialsProvider.setLogins(登录); //credentialsProvider=CognitoCachingCredentialsProvider

现在你应该准备好了。

关于使用 AWS Cognito、Google+ OAuth 和 AccountManager 的 Android 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39003031/

相关文章:

java - 查找设备的 UUID

android - 布置底部对齐的按钮

ruby-on-rails - Ruby API 请求中的 Yahoo Oauth - 签名无效

Android/Google Plus - 无法分享来 self 的内容提供商的图片

java - 无法从 Google Play Android Developer API 获取订阅详细信息

c# - OAuthWebSecurity.RegisterMicrosoftClient 的错误请求 (400)

php - 为 Youtube Oauth Api 编写测试

google-plus - Google+ JavaScript API 是否与 Facebook 的 signed_request 等效?

openid - 没有 Google+ 的 Google OpenID 委托(delegate)提供商

android - 如何将类的上下文放入内部静态类