我目前正在开发一个用 java 实现的已安装桌面应用程序。我打算将 Google Calendar API 集成到应用程序中。
在授权过程中,我到了这个阶段,我只能通过触发显示用户同意页面的浏览器来获取授权码。然后用户必须单击“接受”,然后将被重定向到显示授权代码的网页。用户要将此代码复制到 Eclipse System.in,以便授权过程继续(将授权代码交换为 TokenResponse)。
我的问题是,我怎样才能简化这个过程,这样用户就不必为了接收授权码而做这种愚蠢的复制和粘贴操作? (无论如何这都行不通,如果项目被编译成一个 jar 文件......)目前我所知道的是我需要提供一个 callbackurl 或其他东西,我只是想不通。因此,我希望得到更具体的答案,而不是简单地告诉我概念。
提前致谢。
您必须使用服务帐户(带有私钥)才能跳过涉及用户交互的步骤。 这里有详细的指南.
oauth2 授权流程(我认为,这就是您正在做的)定义您的应用程序通过 HTTP 重定向获取回流。
是这样的:
要让服务器知道重定向到哪里,您可以在步骤 2 中使用 oauth 参数 redirect_uri。
这个页面似乎表明授权码在浏览器窗口的标题中,桌面应用程序应该从那里读取它。 (笨蛋。)
我找到了解决方案。 注意:这是 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");
}