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
它仍然需要用户第一次使用浏览器进行身份验证,但随后您可以存储刷新令牌并将其用于后续请求.
有关替代解决方案,请检查设备流程或服务帐户,它们在同一文档集中进行了说明.
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或已安装)?(规范?)
| 归档时间: |
|
| 查看次数: |
70754 次 |
| 最近记录: |