【问题标题】:What is the best way to access Rest services that secured with OAuth security?访问受 OAuth 安全保护的 Rest 服务的最佳方式是什么?
【发布时间】:2016-04-06 01:41:59
【问题描述】:

我想访问其他供应商编写的 REST Web 服务。但问题在于 OAuth 安全性。我从他们那里得到了用户名、密码、消费者密钥和消费者秘密。

首先我调用一个服务来获取刷新令牌。这是回复

{
   "scope": "PRODUCTION",
   "token_type": "bearer",
   "expires_in": 3148,
   "refresh_token": "315381713fc905a8c5f586d5145bd84",
   "access_token": "46ed281862dc48d2d46372fc2e84e5"
}

获得了带有过期时间的 refresh_token。我必须将此令牌保留在数据库或内存中直到它过期,并且只有在该刷新令牌过期后再次调用此服务以获取刷新令牌。

我不知道如何将这个刷新和访问令牌保存在我身边(数据库或内存)。请帮助我找到更好的方式来访问此服务。

【问题讨论】:

  • 访问和刷新令牌不应该公开发布。它们是你的“秘密钥匙”。很高兴您没有提供“生产”API 端点 :)
  • 是的。这些令牌不是真实的。我编辑它们并在这里发布。

标签: java rest spring-mvc oauth resttemplate


【解决方案1】:

在大多数情况下,您希望将访问令牌和刷新令牌保留得比您的申请进程更长。换句话说,您不想再次重新进行身份验证。这就是为什么将令牌保存在持久存储(数据库、文件等)中会更好的原因。

您可以使用现有的 Java oAuth 客户端来简化您的代码。一些流行的例子是:

oAuth 结果似乎是来自 oAuth 服务器的标准 JSON 结果。所以配置其中一个库应该不会引起任何问题。

【讨论】:

  • 是否有任何标准程序来处理它们,例如加密后的存储数据库以及识别令牌是否过期的最佳方法(调用服务或比较“expires_in”时间限制)?
  • 不,没有“标准程序”。与往常一样,这取决于您的上下文。但无论如何,在大多数情况下,您希望在应用程序重新启动时保留它们。因此,一个不错的选择是将其保存在数据库、中间件(可能是缓存层)或一些临时文件中,但将其读入内存以提高性能。关于你的第二个问题。您可以通过检查期限来请求在访问令牌到期之前更新您的访问令牌,或者您可以在 oAuth 服务器的第一次错误响应时执行此操作。
  • @samithkumarasingha,如果您想知道这些细节,我强烈建议您使用现有的库。因为,我回答中的那些会自动为您完成所有这些,您可以专注于您的业务逻辑。此外,您仍然需要考虑一些安全细微差别,例如在从 Web 客户端获取请求令牌时设置随机字符串等。否则,可能会发生 MiM 攻击。
猜你喜欢
  • 2017-07-30
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
相关资源
最近更新 更多