【问题标题】:Gmail API access using Android使用 Android 访问 Gmail API
【发布时间】:2014-10-29 08:39:43
【问题描述】:

我正在尝试使用 Android 应用程序访问 Gmail API。 我已使用所有可用范围组合成功请求并接收到访问令牌。 但似乎每次我实际尝试使用 Gmail API 命令时,我都会收到403 exception reading: Access not configured please use Google developers console to activate the api...

不用说 API 已激活,并且使用正确的包名称和 sha1 代码创建了客户端密钥。相同的客户端 ID 可以很好地与 Google Plus 功能配合使用。

任何人遇到此问题或成功从 Android 连接到 Gmail api?

谢谢

这是日志:

09-04 21:40:54.014: W/System.err(26717): com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
09-04 21:40:54.014: W/System.err(26717): {
09-04 21:40:54.014: W/System.err(26717):   "code" : 403,
09-04 21:40:54.014: W/System.err(26717):   "errors" : [ {
09-04 21:40:54.014: W/System.err(26717):     "domain" : "usageLimits",
09-04 21:40:54.014: W/System.err(26717):     "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
09-04 21:40:54.014: W/System.err(26717):     "reason" : "accessNotConfigured"
09-04 21:40:54.014: W/System.err(26717):   } ],
09-04 21:40:54.014: W/System.err(26717):   "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project."
09-04 21:40:54.014: W/System.err(26717): }

除了 Google+ API 和 Gmail API 之外,还有其他 API 需要在 API 控制台中启用吗?

编辑:

我发现使用基于 WebView 的身份验证会产生一个访问令牌,该令牌将授予 Gmail API 访问权限,但这不是一个有效的解决方案,因为该令牌是短暂的。至于现在 GoogleAuthUtil 将授予令牌,但它的权限不足以使用 Gmail API。 有人成功地将 Android 与 Gmail API 连接起来并愿意分享吗?

EDIT2:

这是我正在做的事情的 sn-ps:

获取令牌:

token = GoogleAuthUtil.getToken(MainActivity.this, Plus.AccountApi.getAccountName(mGoogleApiClient), scope);

尝试从 Gmail API 获取邮件:

GoogleCredential credential = new GoogleCredential().setAccessToken(token);
JsonFactory jsonFactory = new JacksonFactory();
HttpTransport httpTransport = new NetHttpTransport();

service = new Gmail.Builder(httpTransport, jsonFactory, credential).setApplicationName("GmailApiTP").build();
ListMessagesResponse messagesRespose;
List<Message> m = null;

ArrayList<String> ids = new ArrayList<String>();
ids.add("INBOX");
try {
    messagesRespose = service.users().messages().list("me").setLabelIds(ids).setQ("From: something")
            .execute();
    m = messagesRespose.getMessages();

} catch (IOException e) {
    e.printStackTrace();
}

使用 Gmail API 服务时捕获异常。此外,我尝试清除令牌并要求一个具有相同结果的新令牌。

【问题讨论】:

  • 你尝试实现这个例子吗(developers.google.com/gmail/api/quickstart/…)?
  • 是的。这很简单。但仍然没有解释为什么 GooglaApiCient 返回一个不可用的令牌。
  • 就像一个数据点一样,GoogleAuthUtil 在我使用 Gmail API 从 Jelly Bean 和 KitKat 上的服务发送电子邮件时效果很好。我直接使用 REST API(即通过HttpURLConnection)而不是 Java 客户端库,但这应该与令牌获取无关。在我正确设置 Android 应用程序的客户端 ID 之前,我收到了您的 403 一段时间,但之后自动处理刷新就很好了。您未显示的一个可能出错的地方是在getToken() 呼叫中处理UserRecoverableAuthExtension
  • 设置客户端 ID 的任何特殊方式。我已经做了很多次,但仍然遇到相同的 403 错误。 UserRecoverableAuthExtension 已处理。
  • this page 的第 2 步描述了对我有用的方法。您也可以尝试在您的开发机器上使用令牌,例如卷曲:curl -v -H "Authorization: Bearer ya29.pwAy..." https://www.googleapis.com/gmail/v1/users/me/messages。这将在生成令牌后工作一个小时。如果您想让我看到,请在任何回复中添加@rhashimoto。

标签: android google-oauth gmail-api google-schemas google-oauth-java-client


【解决方案1】:

虽然没有描述清楚,但问题是通过GoogleAuthUtil.getToken()获取的token在本地缓存,可能会过期。您收到的 403 错误是由于令牌过期。处理这种情况的正确方法是调用GoogleAuthUtil.clearToken()移除本地缓存的token,然后调用GoogleAuthUtil.getToken()获取新的。

或者,您可以跟踪上次请求令牌的时间,如果超过一小时(这些令牌的默认到期时间),则提前执行 clearToken + getToken 调用。

【讨论】:

  • 所以我一定是做错了什么,因为即使我用 GoogleAuthUtil.getToken() 请求一个新令牌,然后用 GoogleAuthUtil.clearToken() 清除它,然后请求一个新的,新的仍然无法正常工作 (403)。
  • 您是否设法使用 GoogleAuthUtil 连接到 Gmail API?如果您可以分享您的代码,那就太好了。我可能完全不知道吗?
  • 这里是令牌详细信息:{ "issued_to": "608941808256-43vtfndets79kf5hac8ieujto8837660.apps.googleusercontent.com", "audience": "608941808256-43vtfndets79kf5hac8ieujto8837"660. :“googleapis.com/auth/gmail.readonlygoogleapis.com/auth/gmail.modify”,“expires_in”:3589,“access_type”:“离线”}
  • 如您所见,在我调用 Gmail API (403) 之前它还没有过期。谢谢
  • 你能发布你用来做这个的代码的sn-ps吗?
【解决方案2】:

该错误消息具有欺骗性,我相信当开发人员项目凭据客户端不正确时也会发生这种情况。例如,当您真正想要“已安装的应用程序”时,您选择了“Web 应用程序”。

确认您正确地遵循了以下说明: https://developers.google.com/accounts/docs/OAuth2

(应该是“已安装的应用程序”等)

您能否发布您从开发者控制台获得的 oauth 客户端信息? (在其中输入和任何其他非机密信息等)

【讨论】:

  • 使用深度链接创建了一个已安装的应用程序 (android)。 Sha1 和包验证。相同的客户 ID 适用于 google plus API。感觉这个 API 不是为与 Android 通信而设计的
  • API 与客户端/平台无关,它应该可以在 Android 以及任何其他 Google API 上运行。不确定这里的问题是什么,希望观看 google-oauth 或 google-oauth-java-client 标签的人可以提供一些见解。
  • 谢谢。我会继续努力找出问题所在。问题是我没有看到很多 Gmail API Android 用户能够对实际使用它的人获得良好的反馈。
  • 我现在可以确认从使用 GoogleAuthUtil 类或 AccountManager 类接收到的任何访问令牌都不适用于 Gmail API。另一方面,通过在 API 控制台中将客户端 ID 设置为“其他”的 WebView 请求令牌将起作用。问题是令牌是短暂的。现在我面临一个新问题。如何在不弹出对话框的情况下刷新令牌。
  • stackoverflow.com/questions/25697011/… 看来这是固定的,对吧? (也归功于 Noam Wies。)
【解决方案3】:

您需要在 Google Dev Console 中设置您的 Android 应用密钥。

  1. 选择您的项目,选择 API & Auth,然后点击凭据
  2. 创建新的客户端 ID(尽管它有其他客户端 ID)
  3. 选择已安装的应用程序 -> android
  4. 正确填写你的包名和SHA1
  5. 创建新密钥(尽管它有其他客户端密钥)
  6. 选择安卓键
  7. 填写 SHA1;packageName 像这样:45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example

您的问题将自动解决。请务必使用您的调试密钥库和发布密钥库创建客户端 ID 和密钥。

【讨论】:

    【解决方案4】:

    好吧,这就是交易。到目前为止,GoogleAuthUtil && AccountManager 提供的令牌不适用于 Gmail API。不知道这是否是谷歌的事情,但我的解决方案是这样的:

    在 API 控制台中创建一个客户端 ID(应用程序->其他)。 使用客户端 ID 和客户端密码通过 WebView 获取访问令牌。 保存结果刷新令牌。 现在,每当您想刷新访问令牌时,请使用此请求:

        httpClient = new DefaultHttpClient();
        httpPost = new HttpPost(address);
        params.add(new BasicNameValuePair("refresh_token", token));
        params.add(new BasicNameValuePair("client_id", client_id));
        params.add(new BasicNameValuePair("client_secret", client_secret));
        params.add(new BasicNameValuePair("grant_type", "refresh_token"));
        httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
        httpPost.setEntity(new UrlEncodedFormEntity(params));
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
    

    为我工作。希望将来通过 GoogleAuthUtil.getToken() 选项提供一个有效的令牌。

    【讨论】:

    • 除了使用 webview 没有其他选择吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2022-01-15
    • 2015-08-13
    • 2015-09-05
    • 2016-01-26
    • 2016-09-28
    • 2021-08-10
    相关资源
    最近更新 更多