咱们大家在客户端频繁向服务端申请数据时,服务端就会频繁的去数据库查问用户名和明码并进行比照,判断用户名和明码正确与否,并作出相应提醒,也就是在这样的背景下 Token 便应运而生。
简略来说,Token 是服务端生成的一串字符串,以作为客户端进行申请的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,当前客户端只需带上这个 Token 前来申请数据即可,无需再次带上用户名和明码,其目标是为了加重服务器的压力,缩小频繁的查询数据库,使服务器更加强壮。
生成 Token 过程中的数据加密
在客户端申请服务器端生成 token 的过程中,次要波及的两个数据须要加密的状况。一是首次登陆时须要传用户名和明码,其中明码不能以明文传输,须要 RSA 进行加密,传到服务器端再通过私钥进行解密。二是服务器首次传输 token 给客户端时能够对 token 进行 RSA 加密,客户端再通过私钥进行解密,如下图:
简略理解了 Token 的生成过程和作用后,咱们一起来探讨一下罕用的认证机制,次要有 HTTP Basic Auth(HTTP 根本身份验证)、OAuth(凋谢受权)、Cookie Auth、Token Auth 四种机制。
HTTP Basic Auth
HTTP Basic Auth(HTTP 根本身份验证),简略点阐明就是每次申请 API 时都提供用户的 username 和 password,简言之,Basic Auth 是配合 RESTful API 应用的最简略的认证形式,只需提供用户名明码即可,但因为有把用户名明码裸露给第三方客户端的危险,在生产环境下被应用的越来越少。因而,在开发对外开放的 RESTful API 时,尽量避免采纳 HTTP Basic Auth
OAuth
OAuth(凋谢受权)是一个凋谢的受权规范,容许用户让第三方利用拜访该用户在某一 web 服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和明码提供给第三方利用。
OAuth 容许用户提供一个令牌,而不是用户名和明码来拜访他们寄存在特定服务提供者的数据。每一个令牌受权一个特定的第三方零碎(例如,视频编辑网站)在特定的时段(例如,接下来的 2 小时内)内拜访特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth 让用户能够受权第三方网站拜访他们存储在另外服务提供者的某些特定信息,而非所有内容
上面是 OAuth2.0 的流程:
这种基于 OAuth 的认证机制实用于集体消费者类的互联网产品,如社交类 APP 等利用,然而不太适宜领有自有认证权限治理的企业应用。
Cookie Auth
Cookie(贮存在用户本地终端上的数据)认证机制就是为一次申请认证在服务端创立一个 Session 对象,同时在客户端的浏览器端创立了一个 Cookie 对象;通过客户端带上来 Cookie 对象来与服务器端的 session 对象匹配来实现状态治理的。默认的,当咱们敞开浏览器的时候,cookie 会被删除。但能够通过批改 cookie 的 expire time 使 cookie 在肯定工夫内无效;
Cookie 次要使用于以下三个方面:
1、会话状态治理,如用户登录状态、购物车、游戏分数或其余须要记录的信息;
2、个性化设置,如用户自定义设置、主题等;
3、浏览器行为跟踪。
Token Auth
Token Auth 的长处
Token 机制绝对于 Cookie 机制又有什么益处呢?
1. 反对跨域拜访:Cookie 是不容许垮域拜访的,这一点对 Token 机制是不存在的,前提是传输的用户认证信息通过 HTTP 头传输。
2. 无状态(也称:服务端可扩大行):Token 机制在服务端不须要存储 session 信息,因为 Token 本身蕴含了所有登录用户的信息,只须要在客户端的 cookie 或本地介质存储状态信息。
3. 更实用 CDN:能够通过内容散发网络申请你服务端的所有材料(如:javascript,HTML, 图片等),而你的服务端只有提供 API 即可。
4. 去耦:不须要绑定到一个特定的身份验证计划。Token 能够在任何中央生成,只有在你的 API 被调用的时候,你能够进行 Token 生成调用即可。
5. 更实用于挪动利用:当你的客户端是一个原生平台(iOS, Android,Windows 8 等)时,Cookie 是不被反对的(你须要通过 Cookie 容器进行解决),这时采纳 Token 认证机制就会简略得多。
6.CSRF:因为不再依赖于 Cookie,所以你就不须要思考对 CSRF(跨站申请伪造)的防备。
7. 性能:一次网络往返工夫(通过数据库查问 session 信息)总比做一次 HMACSHA256 计算 的 Token 验证和解析要费时得多。
8. 不须要为登录页面做非凡解决:如果你应用 Protractor 做功能测试的时候,不再须要为登录页面做非凡解决。
9. 基于标准化:你的 API 能够采纳标准化的 JSON Web Token (JWT),这个规范曾经存在多个后端库(NET, Ruby, Java,Python, PHP)和多家公司的反对(如:Firebase,Google, Microsoft)。