28

我正在为我正在处理的项目构建一个 RESTful API,我想让主应用程序使用该 API,因为:

  1. 这将导致需要维护一组代码
  2. 如果我们决定为 3rd 方开发人员公开 API,那么它已经完成了
  3. 它开辟了制作使用它的移动应用程序的可能性
  4. 我真的很想学习如何去做

API 将托管在子域中https://api.example.com,而主 Web 应用程序将托管在根域中https://example.com

从概念上讲,我了解一切是如何工作的,但我的主要问题是身份验证流程将如何改变。通常,第 3 方应用程序会:

  1. 获取请求令牌https://api.example.com/request_token
  2. 重定向用户以进行身份​​验证https://api.authenticate.com/authorize
  3. 被重定向回第 3 方应用程序
  4. 从以下位置获取访问令牌https://api.example.com/access_token

由于我控制这两个域,我可以做类似的事情:

  1. 当用户登陆登录屏幕时获取请求令牌https://www.example.com
  2. https://www.example.com用户使用调用相同代码的表单进行身份验证https://api.example.com/authorize
  3. 如果凭据有效,则将请求令牌交换为访问令牌
  4. 访问令牌保存在会话中,并在用户像往常一样注销时过期

第 3 步感觉是错误的,因为会有重复的代码,但它不会让我受到 XSS 攻击吗?是https://www.example.com发送数据的登录表单,https://api.example.com因为它们在技术上是不同的域?

我是否过于复杂了?

4

2 回答 2

20

我遇到了同样的问题并像这样解决了它。

1 对于第三方应用程序,使用我的 API,他们必须通过 OAuth 对所有请求进行身份验证。

2 对于我自己的第三方客户端(移动设备、AIR 等)- 他们使用 OAuth,不同之处在于我允许这些客户端在授权步骤中直接发送用户名和密码(这样我就可以进行本机登录对话)。前提是您的 API 通过 SSL/HTTPS。

3 对于我的 Web 应用程序,我使用 cookie 身份验证来访问 API。即在登录后,用户可以简单地调用 API:urls 并返回 JSON/XML。也很适合快速探索 API(尽管像 APIGee 这样的真正的 API 控制台在那里做得更好)。

于 2011-12-16T17:49:07.787 回答
0

我会说你有点过于复杂了。如果您的代码被正确分离,您可以轻松地在应用程序的服务层之上构建一个瘦 REST 层,同时让应用程序的控制器也成为服务层之上的一个瘦层。

于 2011-12-16T12:42:57.363 回答