在一些业务需求中,我们可能会遇到一些免登录的接口请求,但这些接口又是不能随便哪个都能请求的。为了安全,通常API采用请求数据附带签名的方式来校验请求是否合法。
实现原理:
前后端双方共同约定一个签名的加密方式,前端按约定的签名加密方式组装签名内容,再加密,最后在请求的时候把加密的签名连同接口请求数据一起发送给后端。后端也按约定的签名加密方式生成一个同样的加密签名,然后把生成的签名和前端请求带过来的签名做比对,看是否一样,一致则是合法请求,反之不合法。
例如,在我们的项目中,请求都是post方式,跟后端约定签名内容为 md5(密钥+group+formData的JSON字符串+密钥).toLowerCase()
。
约定密钥='BLOGFUXIAOCHUNCOM';
let group = 'fuxiaochun365';
let fromData = {id: 10001};
sign = md5('BLOGFUXIAOCHUNCOM'+group+JSON.stringify(formData)+'BLOGFUXIAOCHUNCOM').toLowerCase();
// 请求的时候,约定在header里增加 sign 字段
headers: {
...,
sign: sign
}
API签名和登录token的不同:
API签名是用非对称加密(比如md5), 签名内容不固定,不能轻易解密,根据约定生成相同的签名来比对是否一致。
token是由base64后的,当然也包含了一些加密的密钥等信息,其中payload里的用户登录信息可以解密出来,后端能成功解密并拿到用户登录信息,就不用再查数据库对比账号,直接使用解密出来的payload里的用户账号进行业务逻辑处理。
转载请注明带链来源:春语精椿