5

我正在设计一个 Erlang/OTP 应用程序,它将通过 RESTful API 公开其服务 (SOA)。

构成后端的服务将是数据库服务、价格计算服务等。

客户端可以有多种类型:Web 客户端、移动客户端、Asterisk 服务器客户端(需要在数据库服务中查找用户记录),甚至还有我不打算拥有且还不知道的客户端。客户端会以不同的方式使用 RESTful API:有些会使用所有服务,有些会只使用部分服务(SOA 方式)。

我主要关心的是身份验证/授权。

RESTful Web 应用程序

我不能使用 Ruby on Rails 的内置身份验证/授权,因为 Web 客户端只是许多可能的客户端中的一个客户端,它们将通过 RESTful API 使用应用程序。

所以,我的问题是:

  • 对于预期与许多不同客户端一起使用的典型 RESTful Web 应用程序,身份验证/授权的一般概念是什么?
  • 在 RESTful Web 应用程序中授权/认证最实用的软件设计模式是什么?
  • 您可以推荐哪些 Erlang/OTP 开源软件库来为此类应用程序实现身份验证/授权?
4

1 回答 1

5

只需检查其他人是如何做到这一点的,例如在这篇文章中:Facebook 上的身份验证

一般来说,这个想法是客户端调用一个单独的 API 调用,以便向系统验证自己的身份。系统可以接受任何客户或仅接受来自已注册客户列表的客户。一旦系统验证了客户端,它就会发出一个特殊的令牌,然后客户端将在所有 API 调用中使用该令牌。在 Facebook 文档中,它被称为访问令牌。如果客户端尝试在没有有效令牌的情况下调用 API,系统会将此报告为错误,并且在某些情况下可能会阻止客户端。

在 REST 中,令牌可以简单地作为 URL、POST 中的另一个参数或直接作为 JSON 中的附加字段发送。以 POST 或 JSON 形式发送它可能是最好的,因为它可以保持 URL 干净(并且不会与可能基于 URL 的任何缓存冲突)。

这是这个想法的优点,但通常需要考虑更多的事情。例如,令牌应该难以猜测,因此客户端无法在未通过系统身份验证的情况下重新创建有效令牌。此外,如果在指定时间段内没有调用 API,系统可能需要使令牌过期。

要回答您问题的最后一部分,需要指出一些库:

  • erlang:phash2加密库可用于生成不易猜到的唯一令牌
  • Webmachine作为一个优秀的框架,或者他们喜欢称之为 REST 工具包,用于在 Erlang 中创建 REST 接口
  • API 调用背后的逻辑可以在 Erlang 中实现并直接从 web 服务器提供服务,例如 inets 或 yaws,或者它可以使用像 Nitrogen 或 Chicago Boss 这样的 web 框架来实现。检查这个Erlang Web 框架列表。
于 2012-08-15T12:09:17.403 回答