当我第一次运行我的应用程序而没有保存StoredCredential文件时,程序无法打开浏览器。然后,当我手动打开浏览器,转到打印的链接,然后点击以允许访问我的帐户,该程序不会继续运行。每次我运行程序时,它实际上都是这样做的。
程序每次打印出类似的内容(只有链接更改):
2016-08-31 22:15:53.250:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
2016-08-31 22:15:53.250:INFO::jetty-6.1.26
2016-08-31 22:15:53.258:INFO::Started SocketConnector@localhost:35268
Please open the following address in your browser:
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=723296789344-l7b6jp5ffkmeteokur8qmi5fd8rkont5.apps.googleusercontent.com&redirect_uri=http://localhost:35268/Callback&response_type=code&scope=https://www.googleapis.com/auth/gmail.labels%20https://www.googleapis.com/auth/gmail.compose%20https://www.googleapis.com/auth/gmail.modify
Attempting to open that address in the default browser now...
正如我所说,给定的链接不会自动打开,当我手动操作并接受访问我的帐户时,程序不会继续运行。可能会发生什么想法?此外,如果它有用,我正在使用Ubuntu 16.04并正确设置默认浏览器。
此外,是否有人知道从哪里开始在OAuth框架中实施帐户身份验证?
答案 0 :(得分:1)
<强> 原因: 强>
出现此问题的原因是 google api AuthorizationCodeInstalledApp.class 类。
该课程用于检查 的 Desktop.isDesktopSupported()即可。它总是返回false,因此代码会抛出异常,因为它不适用于所有OS平台。
<强> 解决方案: 强>
创建您自己的自定义类,就像 AuthorizationCodeInstalledApp.class 一样。
保持所有代码相同,只需添加其他部分
if(Desktop.isDesktopSupported()) {
}
else {
Runtime runtime = Runtime.getRuntime();
runtime.exec("rundll32 url.dll,FileProtocolHandler " + url);
}
现在,要获取凭证,请使用
Credential credential= new YourClassName(flow, new LocalServerReceiver()).authorize("user");
而不是:
Credential credential= new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
它会正常工作。
答案 1 :(得分:0)
我认为这是由Class GoogleAuthorizationCodeFlow 和 Credential 对象处理的。在Java Quickstart for Gmail中,您可以看到如何实现:
public static Credential authorize() throws IOException {
// Load client secrets.
InputStream in =
GmailQuickstart.class.getResourceAsStream("/client_secret.json");
GoogleClientSecrets clientSecrets =
GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(DATA_STORE_FACTORY)
.setAccessType("offline")
.build();
Credential credential = new AuthorizationCodeInstalledApp(
flow, new LocalServerReceiver()).authorize("user");
System.out.println(
"Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
return credential;
}
以下是关于Gmail中How authorization works的一些说明:
在较高级别,所有应用都遵循相同的基本授权模式:
1.在开发过程中,在Google API控制台中注册该应用程序。
2.当应用启动时,请求用户授予对其Google帐户中数据的访问权限。
3.如果用户同意,您的应用程序会请求并接收访问Gmail API的凭据。
4.刷新凭证(如有必要)。