Android应用中的Google帐户授权

时间:2012-05-11 19:29:40

标签: android authorization

我正在编写一个与远程服务器通信的Android应用,我希望允许应用用户使用驻留在手机上的Google凭据登录服务器,即无需用户输入他们的Google密码我应用中的任何地方。例如,如果用户的(Android)手机配置了“someguy@gmail.com”,然后他们安装并运行我的应用程序,我的应用程序将向他们显示一个对话框,说“你想以someguy @的身份登录gmail.com?“,点击确定按钮后,他们已经在我的服务器上建立了一个ID,知道他们的电子邮件地址是someguy@gmail.com,由google自己认证。

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

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

过去那一点,我几乎在旋转我的车轮。我看过的食谱似乎要求我做这种形式的http get:

http://<myWebServer>.com/_ah/login?continue=<someUrlIChoose>&auth=<authToken>

...(a)不满意,因为它似乎特别对于appengine而且我希望在我选择的任何后端自由运行这个,并且(b)甚至尝试使用appengine,appengine instance I设置似乎根本没有信号,即日志显示现在查询它(我希望someUrlIChoose url会被调用的东西)...因此没有机会被告知有效性令牌。

具体问题包括:

  • 如何处理身份验证令牌?我是否将其发送到我的服务器,以及 以某种方式让我的服务器联系谷歌验证令牌的有效性 对于指定的帐户?或者是否有一些反向通道 应该已经存在的沟通(在这个阶段) 进程)源自谷歌服务器通知我的服务器 此令牌有效(如果是,我该如何设置)?或者其他的东西 别的?
  • 我是否正确地认为这个过程应该是可行的 任何后端的背景(不仅仅是appengine)?
  • oauth2是我应该使用的(而不是oauth1,或者某种东西 其他)?我读到的所有内容似乎都暗示谷歌的支持 oauth2是“实验性的”......但我还没有确定是否这样 断言是现在的还是旧的;即使是最新的,谷歌也有 将各种产品保持在永久性非最终形式的历史(例如 永恒的beta),所以我不知道该怎么做。
  • 其他任何相关的内容......

2 个答案:

答案 0 :(得分: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);
   }
}

答案 1 :(得分:0)

这是你在寻找的东西吗?

  

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

     

您可能有HTTP端点用于与客户端通信   应用程序,但服务器端代码如何确定谁发送消息   对吗?毕竟,任何人都可以从任何地方发送HTTP POST请求;   如果他们可以猜测他们的用户,他们会冒充他们的用户吗?   身份?

     

要求人们输入用户名和用户名是非常不友好的   移动设备上的密码。特别是,如果有人安装了   您的应用程序并授予其使用Internet并了解您的权限   身份,他们不应再被纠缠。

     

事实证明,Google Play服务现已上市   兼容设备运行Android 2.2或更高版本,提供了很好的   根据Google帐户的使用情况解决此问题。

http://android-developers.blogspot.se/2013/01/verifying-back-end-calls-from-android.html