如何在RESTful API中实现两级身份验证?

时间:2013-11-21 17:21:16

标签: api rest restful-authentication restful-architecture

我正在为一个相当复杂的Web应用程序编写一个RESTful API(进一步称为api.mywebapp.com)

要求包括api.mywebapp.com应该处理:

  • API级别身份验证(授权客户端应用程序,例如:mobile app)
  • 用户级认证(授权www.mywebapp.com 注册用户,以便他们可以访问受保护的资源)

用法示例:

  1. 移动应用程序使用a连接到https://api.mywebapp.com 有效的基本HTTP授权标头(授权:基本 [base64_encoded_username:密码])

  2. api.mywebapp.com对移动应用进行身份验证,成功验证后,它会使用生成的令牌响应请求。

  3. 移动应用现在正在连续使用收到的令牌 要求它。 (api.mywebapp.com还限制经过身份验证的移动应用程序可以执行的API操作,例如:它无法使用系统管理员级API控制器)

  4. 移动应用程序进入需要登录www.mywebapp.com用户才能访问并显示受保护资源的状态。

  5. 这是我不确定应该怎么做的地方。

    api.mywebapp.com是否应该通过基本HTTP身份验证为用户登录挑战移动应用?如果是这样,那么对于API级别,当前的身份验证将如何解决?

    我使用生成令牌的原因是: www.mywebapp.com是非常会话驱动的,令牌也可以作为“会话”标识符(会话也被替换为某些服务器端存储)

    所以我面临两个不同的问题(这个问题实际上是关于第一个问题):

    • 如何使用REST API进行多级身份验证?

    • 如何为会话驱动的Web应用程序实现真正的RESTful API而不会对应用程序本身进行重大更改?我发现此问题很重要,因为在RESTful API中,客户端状态不得存储在服务器上。

1 个答案:

答案 0 :(得分:2)

这几乎与OAuth2“资源所有者密码凭据授权”相同:http://tools.ietf.org/html/rfc6749#section-4.3。在Authorization标头中设置客户端凭据,并将用户凭据发布为x-www-form-url-encoded body。您已使用它的结果可以是承载/会话令牌。

而且,是的,会话有点问题,因为它们要求服务器存储某种客户端状态。您可以使用某种数字签名返回在其中嵌入用户名+密码的持票人令牌,以便客​​户端无法更改它。 OAuth2非常明确地没有说明有关承载令牌的格式。