目前大部分软件系统资源访问都是使用HTTP协议,HTTP是无状态的协议,每次请求默认都是相互独立的。但是大部分情况下我们需要记录请求资源的用户信息,也就是保存会话,从而对资源的访问做限制,这是我们认证功能。常用的认证方式有 :1、HTTP Basic Auth 2、cookie Auth 3、Token Auth 4 OAuth2.0
HTTP Basic Auth
这个最古老的认证方式:登录之后会在客户端本地记录用户名和密码,每次请求资源都要带上用户名密码,后端服务收到之后对用户名和密码进行验证 ,验证通过之后就可以返回资源。这种方式现在基本人用了,弊端很明显,有把用户名密码暴露给第三方客户端的风险, 很不安全。尤其是对外提供接口的情况更不能使用。
cookie Auth
Cookie认证机制就是为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器端创建了一个Cookie对象;通过客户端带上来Cookie对象来与服务器端的session对象匹配来实现状态管理的。默认的,当我们关闭浏览器的时候,cookie会被删除。但可以通过修改cookie 的expire time使cookie在一定时间内有效。cookie不支持跨域,所以不支持跨域的情况。session 保存的用户信息会保存在服务器,如果用户量很大,会消耗 很大的服务器资源。
Token Auth
使用token认证是目前主流的认证方式。原理是用户登录时 服务端生成一串带有用户信息的JSON串,然后通过加密和编码,生成一个无规则的字符串,这个字符串就是token,客户端保存好token,每次请求都带着这个token,可以放在http的header 也可以以参数的形式传递,客户端拿到之后通过解码解密找出用户,验证通过之后就可以返回资源给客户端。
相比于传统的cookie认证方式,这中认证有很多优势。可以支持跨域,跨平台(安卓 IOS WEB),由于不用在服务端保存用户信息,可以减轻服务器的压力,性能要高。针对token认证方式有一套标准JWT(JSON Web Token),目前很多语言(.NET, Ruby, Java,Python, PHP)都支持这套标准,开发起来很方便。
OAuth认证
OAuth认证目前是2.0版本。允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
目前使用OAuth2最典型的使用场景是微信登录认证
1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
其实大部分第三方授权登录都是使用的这种认证方式 QQ认证、新浪微博授权登录、 支付宝授权登录等等。