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

2022-09-01 11:56:50

如何以编程方式向 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,如何使用刷新的令牌获取新的访问令牌。

问题是,当我有新的有效访问令牌时,我找不到有关如何实例化分析对象(例如)以执行查询的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();
    } 
}

问题出在哪里?


答案 1

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

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

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

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


答案 2

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


推荐