如何处理 urn:ietf:wg:oauth:2.0:oob redirect in Google Calendar API Authorization

问题描述 投票:0回答:5

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

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

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

提前致谢。

java oauth-2.0 google-calendar-api google-oauth
5个回答
3
投票

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


1
投票

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

是这样的:

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

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


0
投票

这个页面似乎表明授权码在浏览器窗口的标题中,桌面应用程序应该从那里读取它。 (笨蛋。)


0
投票

我找到了解决方案。 注意:这是 Java 代码,但我敢打赌它在所有其他语言中的工作方式都相同。 问题是我的服务器非常受限,所以我无法在那里启动任何一个浏览器(因为那只是一个没有 UI 的服务器),或者启动本地主机服务器来获取代码。 所有你需要的是定制

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

-1
投票

O 无法从我的 Macbook air 登录我的 gmail。你能解决这个问题吗?

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.