在app应用研发应用或调取Oauth2.0服务、和一些其他api服务常常都有token机制。
为什么要有token机制?
1、区分权限
例如:有些接口可以访问一些公用的信息,这里假设app访问的接口是获取banner轮播图。但有写接口是获取个人资料的情况就需要认证。
2、通用性强
token的传递方式也不限于cookie传递。用户登录成功后返回token(浏览器中可以禁用cookie)。像微信的Oauth的token机制。
用非浏览器手段访问例如php_curl扩展访问、无法自动保存cookie(就是说非浏览器手段无法直接的保存会话状态)、除非解析http返回头
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 1);
设置curl返回请求头。
在php代码中加入
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
说明是cookie在api的请求中有一定的局限性。而cookie需要在请求头上协带。还有一点就是不cookie是无法跨网站的。例如www.solo365.com和blog.solo90.com。生成一个cookie不通用。但在blog.solo90.com和blog.solo90.com中一级域名都是solo90.com二级域名不一样,这种情况下通过配置作用域的不同,可以实现跨域。
多端平台可以通用一个token,例如:火狐。谷歌。IE。android。ipad等
正常的session是以文件存储的,假如多端使用那么,就多个session文件。浪费性能。
但毕竟还是不够灵活多变。扩展性token更强一些
在普通情况下、token和session几乎差不多。性质是一样的,识别用的身份和权限
例如:对方的api是tcp服务器(swoole_server)。session也没有用
token的获取
token需要验证的几点
- 验证是否合法(数据库有没有此用户)
- 验证是否有效(token的失效请、合理的时间)
- 验证对应的权限(对应的权限分组)
token的生成的方式
token的生成可以是一个无意义的加密字符串、各种算法都可以。但是要求唯一性。
微信开发中的token设计
token一般用缓存来做,提升访问速度。每次请求的需要认证,一般用redis。
openid放在服务器里安全系数更高。
token的过期时间服务器可控。
openid在一个小程序或公众号里面openid是不变的、没有失效时间。所以不能放在客户端安全隐患更高。