获取Google一次性授权码

我无法从Google获取一次性授权码。 我试图从Android客户端获取授权码,以便将其发送到我的Rails后端(Web客户端)。

在我的Google Cloud Developer Console中,我有一个包含两个客户端ID的应用程序:

  1. Web应用程序的客户端ID(用于我的rails后端)

  2. Android应用程序的客户端ID(用于我的Android客户端)。 使用的SHA1来自〜/ .android / debug.keystore

假设Web应用程序客户端ID是12345.apps.googleusercontent.com

假设Android客户端ID是67890.apps.googleusercontent.com

这是我的一些代码:

 private final static String WEB_CLIENT_ID = "12345.apps.googleusercontent.com"; private final static String GOOGLE_CALENDAR_API_SCOPE = "audience:server:client_id:" + WEB_CLIENT_ID; private void getAndUseAuthToken(final String email) { AsyncTask task = new AsyncTask<String, Void, String>() { @Override protected String doInBackground(String... emails) { try { return GoogleAuthUtil.getToken(AddExternalCalendarsActivity.this, emails[0], GOOGLE_CALENDAR_API_SCOPE); } catch (UserRecoverableAuthException e) { startActivityForResult(e.getIntent(), IntentConstants.REQUEST_GOOGLE_AUTHORIZATION); } catch (IOException e) { e.printStackTrace(); } catch (GoogleAuthException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String authToken) { if (authToken != null) { saveTokenAndGetCalendars(email, authToken); } } }; String[] emails = new String[1]; emails[0] = email; task.execute(emails); } 

一些额外的笔记

  • 我正在击中GoogleAuthException并接收“未知”作为消息详细信息

  • 我无法添加额外的成员在这个项目的Google云端控制台的权限 – 当添加一个新成员popup出现“服务器错误。哎呀!我们的坏”。 我已经向Google发送了两次反馈。

  • 我指的是这个文档 。 注意下面的报价。 通过“固定”,他们是否说我不需要在我的GOOGLE_CALENDAR_API_SCOPEvariables中join受众群体:server:client_id ? 我已经尝试过和没有,仍然得到相同的GoogleAuthException。

在这种情况下,Android应用程序可以代表设备上的任何Google帐户调用GoogleAuthUtil.getToken()方法,并使用受众范围参数值:server:client_id:9414861317621.apps.googleusercontent.com。 前缀受众:server:client_id:是固定的,范围string的其余部分是Web组件的客户端ID。

  • 如果我使用这个范围,我可以从设备的谷歌authentication。 然而,我读过的文档表明,我需要在范围中使用服务器Web客户端ID(与Android客户端ID在同一个Google控制台项目中),以便服务器代表在Android客户端上授权的用户:

    private final static String GOOGLE_CALENDAR_API_SCOPE = "oauth2:https://www.googleapis.com/auth/calendar";

更新1

我最初添加回答: 我的第一个问题的原因 – 我遇到了GoogleAuthException并收到“未知”作为消息详细信息 – 是我在添加Android客户端ID在云控制台时所犯的一个错误。 SHA1是正确的,但我没有正确input包名。 我使用com.company.app时,我的android包实际上是com.company.android.app。 原始问题中的代码正常工作。 只要确保您在Google云端控制台项目中拥有所有必要的客户端即可。

但是另一个问题依然存在。 当我将从GoogleAuthUtil.getToken()返回的一次性授权令牌发送到Rails后端,然后尝试将其交换为access_token和refresh_token时,我得到以下结果:

 Signet::AuthorizationError: Authorization failed. Server message: { "error" : "invalid_grant" } 

这谷歌文档和几个SOpostbuild议我需要设置access_type=offline 。 但我认为这是当你要求从Web服务器的一次性授权码和离线访问。 我试图从Android客户端请求一次性授权代码并将其发送到Web服务器。

这是可能的与GoogleAuthUtil.getToken()

更新2

即使您只是试图访问日历,Google Pluslogin也必须在该范围内:

 private final static String GOOGLE_CALENDAR_API_SCOPE = "oauth2:server:client_id:" + WEB_CLIENT_ID + ":api_scope:https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/calendar"; 

这SOpost是有帮助的。 另外, Google的Cross Client身份certificate文件也提到:

[注:这一政策正在逐步推出。 目前,涉及访问令牌时,只有在请求的范围包括https://www.googleapis.com/auth/plus.login时才适用。

如果令牌交换在Rails后端工作,我将在答案中总结。

Solutions Collecting From Web of "获取Google一次性授权码"

有两件事为我解决了这个问题:

  1. 确保Android和Web客户端ID在同一个Google云端控制台项目中正确设置。

  2. 使用正确的范围。 即使您只访问日历api,也需要加login:

    //交换validation码访问和刷新令牌的Web服务器的ID

    私人最终静态stringWEB_CLIENT_ID =“12345.apps.googleusercontent.com”; 私人最终静态stringGOOGLE_CALENDAR_API_SCOPE =“oauth2:服务器:client_id:”+ WEB_CLIENT_ID +“:api_scope: https : //www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/calendar ” ;

以下是我所做的:

 final String authToken = GoogleAuthUtil.getTokenWithNotification (this.context, account.name, "oauth2:" + AuthUtils.profileScope, new Bundle (), Contract.authority, new Bundle ()); 

但是,你很明显getToken应该为前台活动工作。

拿这个令牌,把它作为一个HTTP头(通过HTTPS)使用的方式发送到服务器。 只要服务器范围是用于获取令牌的范围的子集,就不会有问题。 服务器使用服务器ID,Android客户端使用Android客户端ID。

您应该将您的范围设置为:

 oauth2:https://www.googleapis.com/auth/calendar 

要么

 oauth2:https://www.googleapis.com/auth/calendar.readonly 

请参阅https://developers.google.com/google-apps/calendar/auth

编辑:好吧,我看到你正在尝试做什么。 范围值是一个空格分隔的列表,所以您可能需要追加观众:server:client_id:到您的范围,如:

 "oauth2:https://www.googleapis.com/auth/calendar audience:server:client_id:12345-your-web-component-client-id"