欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

token

程序员文章站 2022-07-12 12:29:22
...

为什么要使用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签名

场景描述:当你开发完一个接口之后,放到服务器之后有考虑过下面的问题吗?

  1. API对调用者身份进行校验,缺少访问控制,可被随意调用吗
  2. API在权限控制方面未做充分安全设计,权限会被滥用吗
  3. API使用安全的协议了吗,考虑被篡改的情况了吗
  4. API数据交互内容做加密措施了吗
  5. API会被重复调用造成重放攻击吗
  6. 会话做超时设置了吗

解决方案:
对api进行签名(以开放平台为例),具体如下:
1. 为API调用方分配apiKey,apiSecret
2. 为参数签名

 - 参数加入时间戳(timestamp)
 - 对所有需要传输的参数的名称,按照a~z进行升序排序,值为null或空串的参数不参与排序
 - 按排序结果拼接参数值成一个字符串content
 - 对content用SHA256或者是其他JWT token生成算法进行签名,生成apiSign
 - 最终把apiSign加到url最后(位置不定,看与后台规则约定)去请求api

3. 服务端校验
- 服务端获取url中的所有参数
- 检查时间戳是否过期,过期就返回错误,反之下一步
- 验证apiSign,验证不通过就返回错误,反之下一步
- 设置超时
- 允许继续请求

相关标签: token