【问题标题】:Gmail API: Authentication using token retrievalGmail API:使用令牌检索进行身份验证
【发布时间】:2015-04-14 18:51:25
【问题描述】:

我已阅读整篇文章以了解如何使用 OAuth2.0 进行身份验证。 但我没有找到合适的方法在 android 应用程序上执行此操作。请建议一种获取访问令牌的方法,以便我可以构建 Gmail 服务对象并访问收件箱或任何其他方法。

这是他们在link中给出的例子:

GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
Plus plus = new Plus.builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), credential)
    .setApplicationName("Google-PlusSample/1.0")
    .build();

【问题讨论】:

    标签: android google-api gmail


    【解决方案1】:

    调用下面的方法来获取token和移动端使用的google账号。此方法首先检索您手机中的 google 帐户设置,然后检索令牌。 您可以使用首选项保存令牌和帐户名称以供以后使用,这样您就不必每次都检索令牌。

    private void chooseAccount() {
            Intent intent = AccountPicker.newChooseAccountIntent(null, null,
                    new String[]{"com.google"}, false, null, null, null, null);
            startActivityForResult(intent, 9009);
        }
    

    取回账号后,调用下面的方法,

    public static final String MAIL_GOOGLE_COM = "https://mail.google.com";
    public static final String GMAIL_COMPOSE = "https://www.googleapis.com/auth/gmail.compose";
    public static final String GMAIL_MODIFY = "https://www.googleapis.com/auth/gmail.modify";
    private static final String SCOPE = "oauth2:" + GMAIL_COMPOSE + " " + GMAIL_MODIFY + " " + MAIL_GOOGLE_COM;
    
    @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {
                String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                //accountname - google account in your mobile is retrieved
                //now use the google account to retrieve the token
                new GetToken(getActivity().getApplicationContext(), SCOPE, accountName).execute();
                showErrorDialog(exception);
                }
            } else if (requestCode == Activity.RESULT_CANCELED) {
                Toast.makeText(getActivity(), "Cancelled!!!", Toast.LENGTH_SHORT).show();
            }
        }
    

    下面的类是用来获取token的。

    private class GetToken extends AsyncTask<Void, Void, Void> {
        Context context;
        String mScope, mEmail, token;
    
        GetToken(Context context, String scope, String email) {
            this.context = context;
            this.mScope = scope;
            this.mEmail = email;
        }
    
        @Override
        protected Void doInBackground(Void... params) {
            try {
                token = GoogleAuthUtil.getToken(context, mEmail, mScope);
                //save the token using preference for later use or do any good stuff using token here
                Log.v("ranjapp", "Token is " + token);
            } catch (UserRecoverableAuthException e) {
                handleException(e);
            } catch (GoogleAuthException ex) {
                handleException(ex);
            } catch (Exception e) {
                //display a error dialog
            }
            return null;
        }
    
        void handleException(final Exception e) {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (e instanceof UserRecoverableAuthException) {
                        Intent intent = ((UserRecoverableAuthException) e).getIntent();
                        startActivityForResult(intent, 10098);
                    } else if (e instanceof GooglePlayServicesAvailabilityException) {
                        int statusCode = ((GooglePlayServicesAvailabilityException) e)
                                .getConnectionStatusCode();
                        Dialog dialog = GooglePlayServicesUtil.getErrorDialog(statusCode, getActivity(), 10099);
                        dialog.show();
                    }
                }
            });
        }
    }
    

    您必须在 google play 控制台中注册您的应用才能成功获取令牌。还要确保您在应用中设置了播放服务。

    向 Google Cloud Console 注册您的 Android 应用:

    1. 访问谷歌云控制台。
    2. 如果您有要向其中添加 Android 应用的现有项目,请选择该项目。否则,单击顶部的创建项目,输入您的项目名称和 ID,然后单击创建。 注意:您为项目提供的名称是在已连接应用列表中的 Google 设置应用中向用户显示的名称。
    3. 在左侧导航中,选择 APIs & auth。
    4. 通过将状态设置为开启来启用您想要使用的 API。
    5. 在左侧导航中,选择凭据。
    6. 点击适合您应用的创建新客户端 ID 或创建新密钥。
    7. 通过填写您的 Android 应用详细信息来完成显示的表单。 要为您的应用获取 SHA1 指纹,请在终端中运行以下命令: keytool -exportcert -alias &lt;keystore_alias&gt; -keystore &lt;keystore_path&gt; -list -v 例如,您在 Eclipse 中使用调试密钥,则命令如下所示: keytool -exportcert -alias androiddebugkey-keystore ~/.android/debug.keystore -list -v 那么密钥库密码就是“android”。
    8. 点击创建。

    欲了解更多信息:https://developer.android.com/google/auth/http-auth.html

    【讨论】:

    • 这似乎已经解决了。但现在我遇到了另一个错误。未经授权的 401。我已经在一项活动中实现了 Google+ 登录,该活动在我需要邮件的活动之前调用。我应该怎么做才能获得授权?
    • 你拿到令牌了吗?
    • 不,我没有得到令牌。我正在使用 google+ 登录并使用以下代码构建 ApiClient:Scope gmailreadonly = new Scope("oauth2:googleapis.com/auth/gmail.readonly"); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Plus.API) .addScope(Plus.SCOPE_PLUS_LOGIN) .addScope(gmailreadonly) .build(); 但这不起作用。我应该删除 Google+ 登录并实施此方法吗?
    • 您没有使用正确的范围。范围应该是https://www.googleapis.com/auth/plus.login。尝试打印令牌以验证您是否获得令牌。
    【解决方案2】:

    这个库可能会让您更轻松: https://github.com/Hafiz-Waleed-Hussain/EasySocial

    此外,您还可以查看实际实现的源代码。

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 1970-01-01
      • 2018-11-14
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多