30

如何以编程方式向 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 Invalid credentials:

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

4 回答 4

16

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

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

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

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

于 2012-05-31T16:28:38.343 回答
15

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

于 2013-10-26T16:36:51.777 回答
12

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

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

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

从 OP 之前的评论中,我看到以下内容

因此,我遵循了用于 Web 服务器应用程序的 OAuth2(此处记录了离线访问),但我仍然遇到问题。
1)我通过浏览器执行第一个请求,并获得用于离线访问
的认证代码 2)我执行认证代码的 java 发布并获得访问令牌和刷新令牌

我使用的方法更像

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

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

  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,REFRESH_TOKEN步骤 1 中提到的内容可以如下所述获得。

首先,预先设置了一个Web 应用程序,在Google 控制台上为凭据创建 OAuth 2.0 客户端 ID ,您最终会得到一个下载的 json 文件,该文件将被读入GoogleClientSecrets对象。

IE

在此处输入图像描述

确保将 Google Playground 回调 URI 添加到授权重定向 URI

在此处输入图像描述

然后,您为 Playground 准备好您的客户端 ID 和客户端密码,您还可以下载可以拉入 Java 代码的 json。

在此处输入图像描述

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

在此处输入图像描述

注意Access类型是Offline,对应这个

这里还有一个关于获取刷新令牌的很好的解释https://www.youtube.com/watch?v=hfWe1gPCnzc

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

关于刷新令牌,您应该了解它们的生命周期,如此处的文档中所述

在 oauthplayground 你会看到这个

在此处输入图像描述

但是在此处文档的第 4 点上,它说

在此处输入图像描述

嗯。

另请参阅如何在没有用户干预的情况下授权应用程序(Web 或已安装)?(规范?)

于 2016-01-01T23:56:12.823 回答
0

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

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

于 2012-09-21T18:04:47.987 回答