11

我目前正在开发一个用 java 实现的已安装桌面应用程序。我打算将 Google Calendar API 集成到应用程序中。

在授权过程中,我到了这个阶段,我只能通过触发显示用户同意页面的浏览器来获取授权码。然后,用户必须单击“接受”,并将被重定向到显示授权代码的网页。用户应将此代码复制到 Eclipse System.in 以继续授权过程(将授权代码交换为 TokenResponse)。

我的问题是,我怎样才能简化这个过程,以便用户不必为了收到授权码而做这些愚蠢的复制和粘贴操作?(这无论如何都行不通,如果项目被编译成一个 jar 文件......)目前我所知道的是我需要提供一个回调 URL 或其他东西,我只是想不通。因此,我希望得到更具体的答案,而不是简单地告诉我这些概念。

提前致谢。

4

4 回答 4

3

您必须使用服务帐户(带有私钥)才能跳过涉及用户交互的步骤。有一个关于这个here的详细指南。

于 2014-03-20T15:56:12.733 回答
1

oauth2 授权授予流程(我认为,这就是您正在做的事情)定义您的应用程序通过 HTTP 重定向获取该流程。

就像这样:

  1. 您的应用程序打开一个套接字并在那里侦听 HTTP 请求
  2. 它现在打开浏览器并让用户输入他/她的凭据
  3. 用户单击提交并将凭据发送到 oauth 服务器
  4. 服务器检查凭据,如果正确,则将浏览器重定向到您的应用程序(到您在 1 中打开的套接字)。
  5. 您的应用程序从浏览器获取身份验证代码并将其与访问票证交换。

为了让服务器知道重定向到哪里,您在步骤 2 中使用 oauth 参数redirect_uri 。

于 2013-10-31T15:45:14.473 回答
0

此页面似乎表明身份验证代码位于浏览器窗口的标题中,并且桌面应用程序应该从那里读取它。(盖克。)

于 2018-09-19T15:43:40.900 回答
0

我找到了解决方案。注意:这是 java 代码,但我敢打赌它在所有其他语言中的工作方式都是一样的。问题是我的服务器受到很大限制,因此我无法在那里启动任何一个浏览器(因为那只是一个没有 UI 的服务器),要么启动 localhost 服务器以获取代码。您只需要自定义VerificationCodeReceiver

VerificationCodeReceiver inbrowserListener = new VerificationCodeReceiver() {
    @Override
    public String getRedirectUri() throws IOException {
        return "urn:ietf:wg:oauth:2.0:oob";
    }

    @Override
    public String waitForCode() throws IOException {
        // Reading console line
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        return reader.readLine();
    }

    @Override
    public void stop() throws IOException {
    }
};

然后只需在通常的流程中使用它:

private static Credential getCredentials() {
    .....
    return new AuthorizationCodeInstalledApp(flow, inbrowserListener).authorize("user");
}
于 2021-09-09T20:51:14.283 回答