REST和认证
我们在设计REST(Representational State Transfer)风格的Web service API,有一个问题经常要考虑,就是如何设计用户认证的体系(Authentication).
比较传统的做法是首先有一个登陆的API,然后服务器返回一个session ID,后续的操作客户端都必须带上这个session ID,但是这样的,服务就变成了有状态了,不符合REST风格的原则。另外,由于负载均衡的存在,必须有公共存储来保存用户的Session,这也增加了系统的复杂度。
所以比较好的做法是每次都传递认证信息,这样系统就是无状态的,当然由于每次都需要认证,必然降低了一些效率,必要的时候要考虑缓存用户信息在服务器端。
有几点要注意:
1.密码不能传播
一个比较低级的错误是通讯时,由客户端传递用户名和密码到服务器端认证,这样很容易被黑客攻击造成密码泄露。
标准的做法是使用HMAC(Hash-based Message Authentication Code),想法就是不传播password,而传播content和password的混合hash值。我们来看看Amazon S3怎么做认证的。
Amazon对每一个用户有一个AWSAccessKeyId和一个AWSSecretAccessKey,每次HTTP请求需要一个Id和一个Autherticantion信息。 比如:
GET /photos/puppy.jpg HTTP/1.1
Host: johnsmith.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000 Authorization: AWS 0PN5J17HBGZHT7JJ3X82: xXjDGYUmKxnwqr5KXNPGldn5LbA=
这个Authorization的头是这样产生的: 其中YourSecretAccessKeyID用的就是AWSSecretAccessKey。
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature;
Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of( YourSecretAccessKeyID, StringToSign ) ) );
StringToSign = HTTP-Verb + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource;
CanonicalizedResource = [ "/" + Bucket ] +
<HTTP-Request-URI, from the protocol name up to the query string> +
[ sub-resource, if present. For example "?acl", "?location", "?logging", or "?torrent"];
CanonicalizedAmzHeaders = <described below>
这样服务端就很容易根据用户信息来验证信息的正确与否。
2. 验证信息的位置
验证信息可以放在HTTP HEADER里面也可以放在HTTP URL里面,象这样:
GET /photos/puppy.jpg
?AWSAccessKeyId=0PN5J17HBGZHT7JJ3X82&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1
Host: johnsmith.s3.amazonaws.com
Date: Mon, 26 Mar 2007 19:37:58 +0000
放在HTTP HEADER里面的好处是URL比较干净整洁,适合放在internet与人分享,而放在URL里面则有利于发布私有的访问权限给第三方。
3. 如何防范重放攻击(Replay attack)?
理论上,黑客可以窃取你的通讯报文,然后重新发送来通过认证。有几种可能的solution.
a. 客户端所以向服务器申请一个随机数,然后这个随机数作为下次通讯的key,一旦使用过后就立即失效,也就是所谓的”一次一密”。这种方法的好处是很安全,但是增加通讯量,而且由于负载均衡的存在,必须有公共存贮保存这个key。
b.服务器端保存使用过的authertication信息,只要是使用过的就拒绝再次使用。这种方法不需要客户端支持,但是需要公共空间来保持历史记录。
c.使用时间戳。做法就是认证信息中含有时间信息,这样服务器端就可以拒绝时间相隔太长的请求,认为其已经过期。这种做法需要服务器端和客户端有某种形式的时间同步。
4.要不要使用HTTPS?
如果安全度要求很高或者是针对internet的API,无疑应该使用HTTPS,来避免内容被窃取的可能。
如果只是在局域网范围或者可信赖的计算环境,则使用HTTP来提高一点效率。
分享到:
相关推荐
`django-rest-knox` 是一个针对 Django REST 框架的认证令牌管理库,主要用于构建基于令牌(Token)的身份验证系统。这个库允许开发者为 API 用户生成安全、一次性使用的访问令牌,以替代传统的 session-based 认证...
**Django REST Framework (DRF)的JWT认证** 在DRF中,可以使用`djangorestframework-jwt`扩展来实现JWT的签发和验证。以下是一些关键步骤: 1. **安装**: 使用pip安装`djangorestframework-jwt`库。 2. **简单使用...
Header 通常是一个 JSON 对象,包含了令牌的类型(`typ`,通常是 JWT)和签名算法(`alg`,如 HMAC SHA256,表示 HS256)。这个 JSON 对象通过 Base64URL 算法编码成字符串,成为 JWT 的第一部分。 2. **Payload**...
Django Rest Framework JWT 是一种基于 JSON Web Token (JWT) 的认证和授权机制,适用于构建 RESTful API。JWT 是一种安全的、无状态的、令牌化的身份验证方式,它允许服务提供商在客户端和服务器之间传递经过签名的...
本项目"API-REST-COM-JWT:api rest com o jwt gerando token e autenticando"显然关注的是如何在RESTful API中使用JWT来实现用户认证和授权。 首先,RESTful API是基于HTTP协议的,遵循无状态、缓存、统一接口等...
在发送请求时,需要包含特定的请求头参数,如Content-Type(默认为application/json),Cookie(包含验证信息aCMPAuthToken)以及可能的Authorization字段,后者支持AWS4-HMAC-SHA256和Token两种认证方式。...
这里以Python的hmac和base64库来实现加密和解密操作。示例代码中展示了如何生成Token: ```python import time import base64 import hmac import hashlib def get_token(key, expire=3600): ts_str = str(time....
- **认证过程**:涉及使用 HMAC-SHA 算法生成签名。 - **REST 请求认证**:演示了如何为 REST 风格的请求生成签名。 - **SOAP 请求认证**: - **SOAP with WS-Security**:使用 WS-Security 协议进行 SOAP 请求...
签名是前两部分加上一个密钥通过特定算法(如HMAC SHA256)计算得出,确保了令牌的完整性和防止篡改。服务器通过验证签名来确认令牌的有效性。 5. **登录流程**: 用户提交用户名和密码,服务器验证后生成JWT并返回...
9. **使用Amazon Simple DB**:文档提供了如何使用Simple DB的指南,包括可用的库、如何进行API请求、区域端点以及如何使用REST和SOAP请求。 10. **请求认证**:为了保证数据访问的安全,Simple DB要求所有请求都...
头部和载荷都是JSON对象,然后被编码成Base64字符串,签名则是通过将这两部分和一个密钥(secret key)用特定算法(如HMAC SHA256)进行哈希运算得到的。 1. 注册/登录:用户注册并提供凭证(通常是用户名和密码)...
签名算法包括HS256(HMAC+SHA-256)、RS256(RSASSA+SHA256)和ES256(ECDSA使用P-256和SHA-256)。在实践中,这些算法需要通过合适的方式来使用,确保安全性和性能。 五、JSON Web加密(JWE) 1. 加密JWT的结构 ...
3. **Signature**:通过Header和Payload以及一个秘密(Secret Key)使用指定的算法(如HMAC SHA256)计算得出,确保了Token未被篡改。 **Eureka服务注册与发现** Eureka作为服务注册中心,负责维护服务实例的元...
这是一个实现基于角色的访问控制的身份验证和授权库,它将被插入到 Spring Security Framework 中。 特征 基于角色的授权。 可以使用 SPEL 表达式进行配置。 本地身份验证提供程序。 密码使用 HMAC-SHA256 编码。 ...
- **Argo CD Server**: 提供REST API和Web UI,用于与Argo CD交互。 - **Argo CD CLI**: 命令行工具,用于与服务器通信,执行各种操作如部署、回滚、同步等。 - **Application Controller**: 负责监视和同步应用...
总结来说,Django REST framework提供了强大的工具集来构建复杂的Web API,并且其灵活的权限和认证系统可以很好地适应各种不同的需求。通过JWT,可以建立一种无状态的认证方式,这种方式在分布式系统中尤其有用,...
`hashlib`用于MD5加密,`hmac`用于哈希消息认证码,`json`用于JSON序列化和反序列化,而`pymssql`是连接SQL Server的核心库。 3. **定义数据库连接类MSSQL**: 在实际应用中,通常会创建一个类来封装数据库连接的...
- 使用签名密钥和字符串到签名校验进行HMAC-SHA256运算,得到签名。 6. **添加认证头(Authorization Header)** - 最后,在请求头中添加`Authorization`字段,格式为: ``` AWS4-HMAC-SHA256 Credential=...
JWT 是一种轻量级的身份验证机制,它允许应用程序在用户认证后安全地发送和验证用户信息。 首先,让我们深入了解 RESTful API。REST(Representational State Transfer)是一种基于资源的架构风格,强调无状态、...