在Google App Engine中使用Java实现Oauth 2.0

4

我希望在使用Java的Google App Engine应用程序中使用Oauth2,但是我找不到任何好的使用示例。如果有人能帮助我,我将非常感激。找不到好的示例让人感到沮丧,谢谢。

3个回答

10

我的建议是避免使用OAuth2库。当然,意见可能会有所不同,但对我而言,它们提供的抽象层非常不安全,因此最终你会被迫从后门理解OAuth。至少对我来说,花一个小时阅读告诉你所需知道的两页内容,并小心地避开所有其他内容,就可以达到你想要的目标。

简单来说,步骤如下:

  1. 使用您的应用程序/客户端ID和所需的作用域调用auth URL。包括“电子邮件”范围。

  2. Google将引导用户通过登录并(如果第一次通过)授权对话框

  3. 最终,浏览器将重定向回您的oauthcallback url,并传递给您授权代码
  4. 调用google以将授权代码转换为刷新令牌。这还将返回用户的谷歌ID和访问令牌。
  5. 在会话中存储用户ID,以便您随后识别用户
  6. 将刷新令牌与谷歌用户ID一起持久化到数据库中

在随后的访问中...

  1. 如果您在会话中具有谷歌用户ID,则可以从数据库中检索刷新令牌并在需要时使用它来生成访问令牌。
  2. 如果您的会话中没有谷歌用户ID,请按照上述步骤操作。这次,google不会提示用户进行授权(因为已经获得授权),刷新令牌将为空(因为您已经存储了一个)。

你需要了解的所有信息都在OAuth Playground页面内。如果单击按钮,您将看到它遵循我上面概述的步骤。

然后,您需要处理可能出现的错误情况,例如:

  • 用户拒绝权限
  • 用户撤销权限
  • Google过期了刷新令牌(经常发生),因此您需要重新鉴权
  • 超时

您需要阅读的两页内容是:

https://developers.google.com/accounts/docs/OAuth2WebServerhttps://developers.google.com/oauthplayground/ 上有您需要的所有信息,只要您知道如何组合URL、保存刷新令牌(它只是一个字符串)和解析JSON响应。但是,这些文档都没有提到在会话中保留用户ID的需求,以便知道谁正在访问您的应用程序。如果您使用的是AppEngine,则可能会被使用单独的AppEngine登录的示例代码所困扰。请忽略它们。您将使用oauth来验证用户,因此AppEngine的内容不适用且可能会让人感到困惑。实际上,比文档中描述的要简单得多,就像我说的那样,我认为泄漏的库并没有帮助。

1
非常棒的解释,总的来说我在理解OAuth的流程方面有些困难,我会尝试按照您的建议去做,我现在卡住了,希望最终能够得到一些东西,谢谢。 - John B
非常好的总结@pinoyyid。您有关于如何处理更新后的OAuth流程的用户登录/注销的建议吗?我的应用程序目前使用UserService和OpenId。我已经实现并且正在运行OAuth2工作流,但是正在寻找最佳处理用户状态的方法。谢谢! - djpark
@djpark 首先要确定您所说的“注销”是什么意思。您是指(a)终止与您的应用程序的会话,但保持用户登录到 Google,还是(b)退出 Google。对于(a),只需从会话对象中删除用户ID(或您正在跟踪的任何内容)。对于(b),请执行此操作,并调用Google注销URL。对于两者,您都应该显示某种模态框,向用户解释即将发生的事情。 - pinoyyid
2
@pinoyyid 谢谢。我感到困惑的原因是,我的应用程序目前使用AppEngine UserService API通过调用createLoginURL()和createLogoutURL()来使用Google联合登录登入/退出用户,另外还添加/删除用户到会话中。这使我能够利用getCurrentUser()、isUserAdmin()等服务,并且我正在尝试弄清如何使用新的oauth2流程模拟这一过程。我是否遗漏了一些显而易见的东西?这可能值得启动一个新的问题... - djpark

1
我正在尝试做完全相同的事情,我同意 - 非常难找到一个好的例子。
然而,我找到了这个YouTube视频,我认为它会有所帮助:https://www.youtube.com/watch?v=tVIIgcIqoPw
它来自Google,名为“开始使用Google API”。视频的最后一部分涉及身份验证。

0

谢谢您的回复,我已经尝试使用示例http://samples.google-api-java-client.googlecode.com/hg/calendar-appengine-sample/instructions.html,但是我没能成功。我将尝试基于其他示例构建自己的示例。我坚持认为,关于如何在Java应用引擎上安装OAuth 2的入门示例是不存在的。我希望可以制作一个分享给大家,谢谢。 - John B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接