浏览器无法在gmail api

时间:2016-09-01 03:33:03

标签: java browser gmail-api

当我第一次运行我的应用程序而没有保存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框架中实施帐户身份验证?

2 个答案:

答案 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.刷新凭证(如有必要)。