Android应用程序中的Google帐户授权

Android应用程序中的Google帐户授权,android,authorization,Android,Authorization,我正在编写一个与远程服务器对话的Android应用程序,我希望允许应用程序用户使用手机上的google凭据登录到服务器,也就是说,不需要用户在我的应用程序中的任何位置输入他们的google密码。例如,如果用户的(Android)手机配置了“someguy@gmail.com,然后他们安装并运行我的应用程序,我的应用程序将显示一个对话框,告诉他们“您希望以身份登录吗?”someguy@gmail.com?点击Ok按钮,他们就会在我的服务器上建立一个id,知道他们的电子邮件地址是什么someguy@

我正在编写一个与远程服务器对话的Android应用程序,我希望允许应用程序用户使用手机上的google凭据登录到服务器,也就是说,不需要用户在我的应用程序中的任何位置输入他们的google密码。例如,如果用户的(Android)手机配置了“someguy@gmail.com,然后他们安装并运行我的应用程序,我的应用程序将显示一个对话框,告诉他们“您希望以身份登录吗?”someguy@gmail.com?点击Ok按钮,他们就会在我的服务器上建立一个id,知道他们的电子邮件地址是什么someguy@gmail.com,经谷歌自身认证

我已经找到了关于如何实现这一点的广泛而多样的部分方法,包括谷歌自己的oauth2文档,但我还没有理解如何实现这一切

我确实有Android代码,它使用AccountManager来确定给定手机上有哪些google帐户。我会提示用户他们想使用哪个google帐户登录,然后我会得到一个授权令牌

过了那一步,我就开始转动轮子了。我所看到的食谱似乎要求我执行以下形式的http get:

http://<myWebServer>.com/_ah/login?continue=<someUrlIChoose>&auth=<authToken>
http://.com/_ah/login?continue=&auth=
。。。这(a)是不满意的,因为它似乎是特定于appengine的,我希望可以自由地在我选择的任何后端上运行它,(b)即使使用appengine进行实验,我设置的appengine实例似乎根本没有信号,即日志现在显示对它的查询(我希望someUrlIChoose url会被调用一些东西)…因此没有机会被告知令牌的有效性

具体问题包括:

  • 如何处理身份验证令牌…是否将其发送到服务器,以及 不知何故,让我的服务器联系谷歌以验证令牌的有效性 对于指定的帐户?或是否存在一些反向通道 应该已经(在这个阶段)进行的沟通 进程)源于google服务器,通知我的服务器 这个令牌是有效的(如果是的话,我该如何设置它)?或者什么的 还有别的吗
  • 我认为这个过程在未来是可行的,对吗 任何后端的上下文(不仅仅是appengine)
  • oauth2是我应该使用的吗(与oauth1或其他东西相对) 我读到的每一篇文章似乎都暗示谷歌对谷歌的支持 oauth2是“实验性的”……但我还没有确定是否是这样 断言是最新的或旧的;即使是最新的,谷歌也有一个 以永久非最终形式保存各种产品的历史(例如。 永恒的测试版),所以我不知道该如何总结
  • 任何其他相关的

    • 这就是你想要的吗

      大多数Android应用程序都有某种服务器端后端,用于保存和共享数据。即使是最基本的游戏也需要记住它的功能 球员的高分。当你在构建后端时,有一个问题 你必须解决的是后端代码如何知道它在说什么应用程序 以及使用它的人是谁

      您可能有用于与客户端通信的HTTP端点 但服务器端代码如何确定谁在发送消息 毕竟,任何人都可以从任何地方发送HTTP POST请求; 如果你的用户能猜出他们的名字,他们会模仿你的用户吗 身份

      要求用户输入用户名和密码对用户来说真的很不友好 移动设备上的密码。特别是,如果有人安装了 您的应用程序,并授予其使用互联网和了解您的 身份,他们不应该再被纠缠了

      事实证明,Google Play服务现在可以在每个网站上使用 运行Android 2.2版或更高版本的兼容设备提供了良好的性能 这个问题的解决方案,基于谷歌账户的使用


      必须先导入google-play-services_lib,然后才能使用以下代码:

      import com.google.android.gms.auth.GoogleAuthUtil;
      import com.google.android.gms.auth.UserRecoverableAuthException;
      
      private void gmail_login() {
      
          dialog = ProgressDialog.show(LoginActivity.this, "", getString(R.string.login_loading), true);
      
          AsyncTask task = new AsyncTask() {
              @Override
              protected Object doInBackground(Object... params) {
                    getAndUseAuthTokenBlocking();
                  return null;
              }
           };
           task.execute((Void)null);
      }
      
      
      void getAndUseAuthTokenBlocking() {
         try
         {
            String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email";
            AccountManager accountManager = AccountManager.get(this);
            Account[] accounts = accountManager.getAccountsByType("com.google");
      
            String token = GoogleAuthUtil.getToken(this, accounts[0].name, AUTH_TOKEN_TYPE);
            //token here
         } 
         catch (UserRecoverableAuthException userAuthEx) {
             startActivityForResult(userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE);
         }catch (Exception e){
             DropErrorMsg.drop(this, handler, R.string.connection_error, R.string.error, dialog, false);
         }
      }