android - Android 应用中的 Google 帐户授权

标签 android authorization

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

我发现了关于如何实现这一点的广泛而多样的部分秘诀,包括谷歌自己的 oauth2 文档,但还没有对如何实现这一切的理解。

我确实有 Android 代码,它使用 AccountManager 来确定给定手机上有哪些谷歌帐户。我提示用户他们想使用哪个谷歌帐户登录,然后我取回授权 token 。

过了那个点,我几乎在旋转我的轮子。我看过的食谱似乎要求我使用这种形式的 http get:

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

... 这 (a) 令人不满意,因为它似乎特定于 appengine,我希望可以自由地在我选择的任何后端上运行它,以及 (b) 甚至尝试使用 appengine,我的 appengine 实例已经设置似乎根本没有发出信号,即日志显示现在对它的查询(我希望 someUrlIChoose url 会被调用一些东西)......因此没有机会被告知有效性 token 。

具体问题包括:

  • 我如何处理授权 token ...我是否将它发送到我的服务器,以及 以某种方式让我的服务器联系谷歌来验证 token 的有效性 对于指定的帐户?或者是否有一些反向 channel 本来应该有的沟通(在这个阶段 进程)源自谷歌服务器通知我的服务器 此 token 有效(如果有效,我该如何设置)?或者其他的东西 还有吗?
  • 我认为这个过程应该在 任何后端(不仅仅是应用引擎)的上下文?
  • 我应该使用 oauth2 吗(与 oauth1 或其他东西相反) 别的)?我读到的一切似乎都暗示谷歌支持 oauth2 是“实验性的”......但我还不确定是否这样 断言是当前的还是旧的;即使是当前的,谷歌也有 以永久非最终形式保存各种产品的历史(例如 永恒的测试版),所以我不知道该对此下什么结论。
  • 任何其他相关的...

最佳答案

您必须先导入 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);
   }
}

关于android - Android 应用中的 Google 帐户授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557478/

相关文章:

java - TextView 拒绝更改文本

Intent "Extra"键与 Bundle 键的 Android 命名约定

c# - WEB API - 在 Controller 或操作级别授权(无身份验证)

android - 如何在 FrameLayout 中将图像设置在中心

java - Android:Resources.getSystem().getIdentifier 返回 java.lang.IllegalArgumentException

python - Gradle 使用 Chaquopy 构建内存问题

node.js - 如何在重定向 Express 4 之前找到原始请求路径

c# - Asp .Net Core 中的访问被声明授权拒绝

node.js - 如何授权 HTTP POST 请求以使用 REST API 执行数据流模板

c# - 如何在 .NET Core 应用程序中创建和实现授权过滤器