【发布时间】:2010-10-02 06:57:46
【问题描述】:
我目前正在为 .net 开发一个 REST 库,我想听听一些关于我的开放点的意见:REST 和身份验证。
以下是与库一起使用的 RESTful 接口示例:
[RestRoot("/user")]
public interface IUserInterface
{
[RestPut("/")]
void Add(User user);
[RestGet("/")]
int[] List();
[RestGet("/get/{id}")]
User Get(int id);
[RestDelete("/delete/{id}")]
void Delete(int id);
}
然后服务器代码只实现接口,客户端可以通过工厂获得相同的接口。或者,如果客户端不使用该库,则标准 HTTP 请求也可以工作。
我知道使用 HTTP Basic Auth 或向需要经过身份验证的用户的请求发送令牌的主要方法。
第一种方法(HTTP 基本身份验证)存在以下问题(部分特定于 Web 浏览器):
- 每次请求都会传输密码 - 即使使用 SSL,这也有某种“不好的感觉”。
- 由于密码是通过请求头传输的,本地攻击者很容易通过查看传输的头来获取密码。
- 密码在浏览器内存中可用。
- 没有使用户“会话”过期的标准方法。
- 使用浏览器登录会中断页面的外观。
第二种方法的问题更侧重于实现和库的使用:
- 每个需要认证的请求URI都必须有一个token的参数,这只是非常重复。
- 如果每个方法实现都需要检查令牌是否有效,则需要编写更多代码。
- 界面将变得不那么具体,例如
[RestGet("/get/{id}")]与[RestGet("/get/{id}/{token}")]。 - 在哪里放置令牌:在 URI 的末尾?根之后?其他地方?
我的想法是将令牌作为参数传递给 URL,例如 http:/server/user/get/1234?token=token_id。
另一种可能性是将参数作为 HTTP 标头发送,但我猜这会使普通 HTTP 客户端的使用变得复杂。
令牌会在每个请求中作为自定义 HTTP 标头(“X-Session-Id”)传回客户端。
这可以从接口中完全抽象出来,任何需要身份验证的实现都可以只询问令牌(如果给定的话)属于哪个用户。
您认为这是否会过多地违反 REST 或者您有什么更好的想法?
【问题讨论】:
标签: authentication rest