java 如何在Google日历API授权中处理urn:ietf:wg:oauth:2.0:oob重定向

zz2j4svz  于 2023-03-11  发布在  Java
关注(0)|答案(4)|浏览(161)

我目前正在安装一个用java实现的桌面应用程序。我打算将谷歌日历API集成到应用程序中。
在授权过程中,我会进入这个阶段,此时我只能通过触发显示用户同意页面的浏览器来获取授权码。然后,用户必须单击“接受”,并将被重定向到显示授权码的网页。用户需要将此代码复制到EclipseSystem.in,以便授权过程继续(以交换令牌响应的授权码)。
我的问题是,如何简化这个过程,使用户不必为了接收授权码而进行这种愚蠢的复制和粘贴操作?(如果项目被编译成jar文件的话,这是行不通的...)目前我只知道我需要提供一个callbackurl或者其他什么东西,我就是想不出来。因此,我希望你能给我一个更具体的答案,而不是简单地告诉我概念。
先谢了。

cld4siwp

cld4siwp1#

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

vecaoik1

vecaoik12#

oauth2授权授予流(我认为这就是您正在做的)定义了应用程序通过HTTP重定向获取流。
事情是这样的:
1.您的应用程序打开一个套接字并在那里侦听HTTP请求
1.现在,它将打开浏览器并允许用户输入其凭据
1.用户单击submit并将凭据发送到oauth服务器
1.服务器检查凭据,如果正确,则将浏览器重定向到您的应用程序(重定向到您在1中打开的套接字)。
1.您的应用程序从浏览器获取授权代码,并将其与访问票证交换。
为了让服务器知道重定向到哪里,您在步骤2中使用了oauth参数redirect_uri。

unguejic

unguejic3#

This page似乎表明auth代码在浏览器窗口的标题中,桌面应用程序应该从那里读取它。

rekjcdws

rekjcdws4#

我找到了解决办法。这是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");
}

相关问题