OAuth 总是正确的选择吗(什么时候不是)

信息安全 验证 移动的 oauth
2021-08-25 01:52:26

我正在创建一个移动应用程序,它需要在每个用户的基础上与 API 进行交互。作为第三方 API 的客户,我参与了多个项目,最初的想法是使用 OAuth。但是,我一直在考虑,并且我不打算向其他消费者公开开放 API - 唯一的消费者永远只是我的移动应用程序,所以考虑 OAuth 是否真的是最合适的?还是矫枉过正?

然后,我阅读了这篇文章,就 Google 的一个流程提供建议,其中针对这种情况建议了以下方法:

  • 使用基于 Web 的普通登录表单在您的应用中嵌入 Web 视图
  • 成功登录后,将安全 cookie 传递给具有安全令牌的移动应用程序
  • 在未来的 API 请求中使用令牌

(假设遍布https等)

这似乎比任何 OAuth 实现都简单得多,并且可以很容易地使用 Spring Security Filter/authentication 链来完成(我的服务器端代码是 Java & Spring MVC/Secutiry 等)。谷歌推荐的方法似乎很有趣,在我看来这增加了解决方案的可信度。

假设使用上述解决方案,我还包括了一个移动应用程序密钥等(只是为了阻止任何移动设备点击表单/API),它似乎与 OAuth 存在相同的问题,因为我必须包含我嵌入的应用程序密钥移动代码(可以反编译等)。

我还阅读了这篇关于 Amazon 方法的文章(显然类似于 OAuth 1 实现),这似乎是对上述 google 提出的解决方案的合理扩展,而不是将令牌发送到服务器,而是将其用作哈希请求数据。

除了普通的基于 Web 的用户/密码安全性之外,我对在安全性方面实施任何东西都很陌生 - 因此,我希望了解何时将 OAuth 用于移动应用程序以及上述两种解决方案(亚马逊和谷歌)是否适合它们的目的被 OAuth 2 取代。

1个回答

问题第一部分的答案很简单:没有协议总是正确的选择。

OAuth 解决了(好吧,提供了一个解决方案)很多小问题,比如授权客户端和以半粒度的方式跨浏览器、活动客户端以及介于两者之间的任何东西保护资源。

它可能是矫枉过正,这是不使用它的一个很好的理由。它不进行身份验证(OpenID Connect 是 OAuth 的 authn 扩展),并且它不提供其他协议所做的某些行为,例如 SAML,但另一方面,这可能是一件好事。

Google 提供的解决方案具有 OAuth 的许多特性,但严重依赖 cookie,并且看起来不能很好地扩展以供公众使用。如果您不关心公开公开 API 可能没问题,但如果您愿意,那么 OAuth 将是相对于该解决方案更好的方法。

如果您确实采用 OAuth 路线,您可能希望支持最新版本,因为它可以让您访问 OpenID Connect。否则,您将无法构建自己的身份验证方式,并且所有客户端都必须针对您的定制设计实施。