token
为什么要使用token?
因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证是好的用户,才允许调用API。
目前主流的访问权限控制/认证模式
Bearer Token(Token 令牌)
定义:
为了验证API请求者的身份,需要客户端向服务器端提供一个可靠的验证信息,这种信息我们称为Token,这个token通常由Json数据格式组成,通过hash散列算法生成一个字符串,即我们平时所称的Json Web Token(简称JWT)
token主要由3部分组成
头部
头部用于表面这是一个JWT,并指定加密方式,以base64方式进行编码
//头部案例
{
"typ" : "JWT", (typ:类型)
"alg" : "HS256" (alg:算法,HS256表示哈希算法的mac值。SHA256/HmacSHA256,SHA256表示直接加密,HmacSHA256表示用秘钥进行加密。SHA(Secure) Hash Algorithm ,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码))
}
Claim正文
正文可以包含用户的一些信息,如email、账户、用户名等,同时也包含了token的国旗时间,以unix时间戳的方式记录,以base64进行编码
{
"user":"iven",
"exp":265431552,//token过期时间,以毫秒数进行计算
"content":"web site transfer content"
}
签名(sign)
签名就是把上面两部分进行结合,再加上一些本地信息进行拼接,然后使用头部里面指定的算法进行生成对应的一串字符
token的优点是什么?
1. 无状态性,并且易于拓展(如与其他程序共享权限)
2. 在操作中避免不断的输入账号密码,防止账号密码被窃取
3. 利用token为第三方应用提供权限,而非账号密码,安全性更高
4. 支持跨平台、多语言
应用案例
api签名
场景描述:当你开发完一个接口之后,放到服务器之后有考虑过下面的问题吗?
- API对调用者身份进行校验,缺少访问控制,可被随意调用吗
- API在权限控制方面未做充分安全设计,权限会被滥用吗
- API使用安全的协议了吗,考虑被篡改的情况了吗
- API数据交互内容做加密措施了吗
- API会被重复调用造成重放攻击吗
- 会话做超时设置了吗
解决方案:
对api进行签名(以开放平台为例),具体如下:
1. 为API调用方分配apiKey,apiSecret
2. 为参数签名
- 参数加入时间戳(timestamp)
- 对所有需要传输的参数的名称,按照a~z进行升序排序,值为null或空串的参数不参与排序
- 按排序结果拼接参数值成一个字符串content
- 对content用SHA256或者是其他JWT token生成算法进行签名,生成apiSign
- 最终把apiSign加到url最后(位置不定,看与后台规则约定)去请求api
3. 服务端校验
- 服务端获取url中的所有参数
- 检查时间戳是否过期,过期就返回错误,反之下一步
- 验证apiSign,验证不通过就返回错误,反之下一步
- 设置超时
- 允许继续请求
上一篇: 861. 翻转矩阵后的得分(JavaScript)
下一篇: token
推荐阅读
-
Oauth2.0开发 为什么子要提交access_token或者还有一两个其他固定参数就能识别用户身份?
-
vue拦截器实现统一token,并兼容IE9验证功能
-
微信小程序非开放接口开发,token使用
-
[PHP] - Laravel - CSRF token禁用方法
-
java调用新浪长连接转短链接api--新浪微博Oauth2.0授权 获取Access Token
-
12-2 oauth2.0获取微博的access_token
-
Java Https Token认证,后端处理
-
java http token请求代码实例
-
PHP使用token防止表单重复提交的方法
-
ThinkPHP5.1表单令牌Token失效问题的解决