使用OAuth2以编程方式向Google进行身份验证

时间:2012-05-31 14:13:23

标签: java google-oauth google-login

如何以编程方式向Google进行身份验证? 现在ClientLogin(https://developers.google.com/accounts/docs/AuthForInstalledApps) 不推荐使用,我们如何使用OAuth2对Google执行程序化身份验证?

使用ClientLogin,我们可以执行帖子 https://www.google.com/accounts/ClientLogin 使用电子邮件和密码参数并获取身份验证令牌。

使用OAuth2我找不到解决方案!

我的应用是一个java后台进程。 我看到了以下链接:developers.google.com/accounts/docs/OAuth2InstalledApp#refresh,如何使用刷新的令牌获取新的访问令牌。

问题是,当我有一个新的有效访问令牌时,我找不到关于如何实例化Analytics对象(例如)来执行查询的java示例

这是我的代码,在调用“execute()”时返回401无效凭据:

public class Test {

static final String client_id = "MY_CLIENT_ID";
static final String client_secret = "MY_SECRET";
static final String appName = "MY_APP";

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();

static String access_token = "xxxx";
static String refreshToken = "yyyyy";

public static void main (String args[]){

    try {

        GoogleCredential credential = 
            new GoogleCredential.Builder()
                .setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setClientSecrets(client_id, client_secret).build();
        credential.setAccessToken(access_token);
        credential.setRefreshToken(refreshToken);
        //GoogleCredential
        Analytics analytics = Analytics.builder(HTTP_TRANSPORT, JSON_FACTORY)
            .setApplicationName(appName)
            .setHttpRequestInitializer(credential)
            .build();

        Accounts accounts = analytics.management().accounts().list().execute();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

有什么问题?

4 个答案:

答案 0 :(得分:16)

检查安装的应用程序的OAuth 2流程:

https://developers.google.com/accounts/docs/OAuth2InstalledApp

它仍然要求用户第一次使用浏览器进行身份验证,但随后您可以存储刷新令牌并将其用于后续请求。

对于替代解决方案,请检查设备流程或服务帐户,它们在相同的文档集中进行了解释。

答案 1 :(得分:15)

我发现Google Java客户端过于复杂且记录不完整。这是使用Google Oauth2的简单Servlet example。对于后台进程,您需要请求access_type = offline。正如其他人提到的那样,您需要用户进行一次授权。之后,您可以请求刷新令牌,因为Google令牌会在一小时后过期。

答案 2 :(得分:9)

虽然我很欣赏OP最初的目标是OAuth2InstalledApp方法,但我想指出一种使用OAuth2WebServer方法的工作解决方案。它们没有显着差异,这对我有用。我发现google OAuth库非常好,因为它可以为您处理大部分OAuth舞蹈,并且可以轻松刷新访问令牌。以下解决方案取决于使用预先获得的刷新令牌。

正如接受的答案所述,要使OAuth身份验证工作(即使是Java后台进程),请求依赖于对用户数据的访问

  

要求用户第一次使用浏览器进行身份验证,但随后您可以存储刷新令牌并将其用于后续请求。

从OP先前的评论中我看到以下

  

所以我遵循OAuth2进行Web服务器应用程序(这里记录了离线访问),但我仍有问题   1)我通过浏览器执行第一个请求,我获得了离线访问的autenticaton代码   2)我执行认证码的java帖子并获取访问令牌和刷新令牌

我使用的方法更像是

  

1)我通过浏览器执行第一个请求并获取用于离线访问的刷新令牌
  2)在java中,我向库提供刷新令牌,库将获取访问令牌等

具体来说,使用google-api-java-client library代码非常简单,请注意我没有像OP那样设置访问令牌,因为我在其他地方调用了credential.refreshToken();。 (我检查是否已经有一个有效的访问令牌,如果没有在API调用之前调用刷新)

  private Credential generateCredentialWithUserApprovedToken() throws IOException,
      GeneralSecurityException {
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    InputStreamReader inputStreamReader =
        new InputStreamReader(jsonFileResourceForClient.getInputStream());
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, inputStreamReader);
    return new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory)
        .setClientSecrets(clientSecrets).build().setRefreshToken(REFRESH_TOKEN);
  }

注意这包括我的方法的第2步,并且可以获得步骤1中提到的REFRESH_TOKEN,如下所述。

首先,在web app上预先设置Google console for Credentials创建OAuth 2.0客户端ID,最后您将获得一个已下载的json文件,该文件将被读入GoogleClientSecrets对象

即。

enter image description here

确保将Google游戏场回调uri添加到授权重定向URI

enter image description here

然后你有你的客户端ID和操作员的秘密客户端秘密,你也可以下载json,你可以将它拉入你的Java代码。

enter image description here

通过使用以下配置向google oauth playground发送请求来获取REFRESH_TOKEN。请注意,在步骤1和选择范围之前,您应该进行设置以检查您是否提供自己的凭据并在其下方添加您的客户端ID和密码

enter image description here

请注意,Access类型为Offline,与this对应。

在此处抓取刷新令牌还有一个很好的解释https://www.youtube.com/watch?v=hfWe1gPCnzc

这足以让你开始并且是一次性设置!

关于刷新令牌,您应该了解文档here

中讨论的生命周期

在oauthplayground你会看到这个

enter image description here

但在文档here的第4点,它说明了这个

enter image description here

嗯。

另请参阅How do I authorise an app (web or installed) without user intervention? (canonical ?)

答案 3 :(得分:0)

对于代表自己进行身份验证的应用程序(例如,传统上通过使用共享密码登录角色帐户),Google提供的ClientLogin的OAuth2替代方案是服务帐户:

https://developers.google.com/accounts/docs/OAuth2ServiceAccount