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

And*_*zin 26 java google-login google-oauth

如何以编程方式向Google进行身份验证?现在的ClientLogin(https://developers.google.com/accounts/docs/AuthForInstalledApps)已过时,我们如何能够执行编程认证,以与谷歌的OAuth2?

使用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();
    } 
}
Run Code Online (Sandbox Code Playgroud)

问题是什么?

Cla*_*ino 16

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

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

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

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

  • 我检查了安装应用程序的OAuth 2流程,但它没有解释如何刷新访问令牌以及如何执行脱机访问(我需要离线访问我的bacgrond进程).所以我遵循OAuth2进行Web服务器应用程序(这里记录了离线访问),但我仍然有问题.1)我通过浏览器执行第一个请求,我获得了离线访问的autenticaton代码2)我执行了验证码的java帖子并获取了访问令牌和刷新令牌 (2认同)
  • $ Andrea,如果你找到了一个解决方案,那么对其他人来说看看它最终会有什么帮助会很有帮助.用有效的方法回答问题并接受它! (2认同)

And*_*rew 15

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


Mat*_*t C 10

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

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

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

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

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

我使用的方法更像是

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

特别是,使用google-api-java-client库,代码非常简单,请注意我没有像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);
  }
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

确保将Google playground回调uri添加到授权重定向URI中

在此输入图像描述

然后,您可以将您的客户端ID和客户端密码准备好用于游乐场,您也可以下载可以提取到Java代码中的json.

在此输入图像描述

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

在此输入图像描述

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

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

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

关于刷新令牌,你应该知道自己的生命周期中的文档讨论在这里

在oauthplayground你会看到这个

在此输入图像描述

但在这里的文档的第4点它说这个

在此输入图像描述

嗯.

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