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

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

使用ClientLogin,我们可以使用电子邮件和密码参数向https://www.google.com/accounts/ClientLogin发送post并获取身份validation令牌。

使用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(); } } 

问题是什么?

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

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

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

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

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

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

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

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

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

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

我使用的方法更像是

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); } 

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

首先,在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或已安装)? (规范?)

我已经记录了一个使用Javascript并获取授权令牌的示例

http://www.alexroque.com/?p=307

希望它有所帮助,您要做的是确保我们的返回URI在API控制台中正确设置,并且您可以从响应中正确解析令牌。

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

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

Interesting Posts