Erlang/OTP:RESTful 应用程序中的授权/身份验证

ska*_*tek 6 rest erlang authorization restful-authentication erlang-otp

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

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

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

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

RESTful Web 应用程序

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

所以,我的问题是:

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

Gre*_*reg 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 框架列表。