一直对token的作用不大明白. ###一.微信公众号
开发微信公众号的时候,我们需要在微信公众平台的配置界面 写一个token和我们服务器端的url接口.
普通用户和公众号交互的具体流程是:用户发送一条文本或其他信息,该信息发送到微信的服务器,微信的服务器向之前我们填写的服务器的url接口,推送该用户发送的信息,为了保证良好的体验,微信希望我们能在5秒内作出响应。
微信每次推送信息给我们的服务器时,都会直接在url后携带几个参数,signature,timestamp,nonce 具体的验证: 把token(我们指定的,当然是已知), timestamp,nonce 三个值以字典序排序后,进行sha1加密。 和signature 比较,如果相同,则可认定是微信在访问我们的接口,而不是其他恶意来源。
当我们访问微信的接口时,微信要求我们必须携带一个access_token. 这个access_token是哪里来的呢?我们可以看到开发者设置界面有一个app_id, app_sercet。我们可以根据这个两个参数,访问一个获取access_token的接口即可返回. 以后,我们访问微信提供的接口都携带access_token即可,注意,access_token是有时间限制的,默认过期时间为7200秒,每天获取access_token的次数也是有上限的.只要按照规定来,完全是够用的..
通过access_token,微信服务器也可以确定是哪个微信公众号的合法请求,而不是恶意用户
###二.公司的项目里用到的token
我们的Android端(其他同理)访问接口时,必将携带下面的参数
reqtime, user, token, source Android端这里的source和user 都是'Android'.
验证: 先看source渠道,根据user,source,key,reqtime一起md5. 看是不是和token相等。这里面只有key不是通过网络传输过来的. 这里可以还可以根据reqtime, 给定一个时间约束,一旦超过指定时间,则视为无效
三.比较
项目中的验证方法和微信还是类似的.只是名字不一样罢了. 都是本地持有一个私有的字符串(微信公众号里叫token,我们叫key)这里统一叫S, 这个S是不变的,任何时候都不需要通过网络传输的 根据这个S, 和其他一些参数,比如A,B . 通过加密生成一个新的字符串C.我们只需要传输A,B,C即可
对方拿到A,B,C三个参数后,再按照之前的算法,A,B,S加密看是不是等于C. 只要等于C,说明就是合法的来源