在探讨前端常用的鉴权方式之前,我们先来明晰几个关键概念:认证、授权、鉴权以及权限控制,搞清楚它们之间的关系,能帮助我们更好地理解后续内容。
认证(Identification),是依据声明者独有的识别信息来确认其身份。就好比我们需要用身份证来证明“我就是我”。常见的认证技术涵盖用户的生物学特征,如指纹、语音、眼睛虹膜,还有用户的大数据识别等。
授权(Authorization),在信息安全领域指资源所有者委派执行者,并赋予执行者特定范围的资源操作权限。在现实生活中,像银行卡(由银行派发)、门禁卡(由物业管理处派发)、钥匙(由房东派发),这些都是授权的体现;在互联网领域,web服务器的session机制、web浏览器的cookie机制、颁发授权令牌(token)等,均属于授权机制。
鉴权(Authentication),在信息安全领域,是对声明者所声明的身份权利的真实性进行鉴别确认。从授权的角度出发,更容易理解鉴权,授权和鉴权是上下游匹配的关系,先有授权,才有鉴权。在现实生活里,门禁卡需要通过门禁卡识别器验证,银行卡需要通过银行卡识别器验证;在互联网领域,则是校验session/cookie/token的合法性与有效性。鉴权起着承上启下的作用,它接收授权的输出,校验其真实性后获取权限(permission),为下一步的权限控制做准备。
权限控制(Access/Permission Control),是将可执行的操作定义为权限列表,然后判断操作是否被允许或禁止。可以从权限和控制两方面来理解,权限是抽象的逻辑概念,控制是具体的实现方式。例如在现实生活中,有的门禁卡拥有开公司所有门的权限,有的门禁卡因具备管理员角色权限,所以能开公司所有的门;在互联网领域,通过web后端服务控制接口访问,决定是否允许访问请求。
认证、授权、鉴权和权限控制这四个环节,通常是前后依次发生、呈上下游关系的。不过,在某些场景下它们也会同时出现。比如使用门禁卡开门,认证、授权、鉴权、权限控制四个环节瞬间同时完成;用户登录网站时,在使用用户名和密码登录的那一刻,认证和授权一同完成,而鉴权和权限控制则在后续的请求访问中,如选购物品或支付时发生。
接下来,我们详细探讨前端常用的鉴权方式。
在HTTP中,基本认证方案(Basic Access Authentication)允许客户端(一般指网页浏览器)在请求时,通过用户提供用户名和密码的方式来验证用户身份。不过,如今几乎所有的线上网站都不会采用该认证方案,了解即可。
认证流程图及步骤解析:
GET /list/ HTTP/1.1
Host: www.baidu.com
Authorization: Basic aHR0cHdhdGNoOmY=HTTP/1.1 401 Unauthorized
www - Authenticate: Basic realm = "baidu.com"GET /list/ HTTP/1.1
Authorization: Basic Ksid2FuZzp3YW5n==HTTP/1.1 OK...优点:该方式较为简单,且基本所有流行的浏览器都支持。
缺点:
使用场景:适用于内部网络,或者对安全要求不高的网络。
Session - Cookie认证利用服务端的Session(会话)和浏览器(客户端)的Cookie来实现前后端通信认证。在理解这种方式前,我们先简单了解一下Cookie和Session。
HTTP是无状态协议,对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息。为了让服务器区分不同的客户端,就需要主动维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器,而这个状态可以通过Cookie来实现。Cookie是由服务器生成,发送给浏览器并存储在浏览器中的一小段数据,下次浏览器向同一服务器发送请求时,会自动带上该Cookie。
Session则是服务器端为每个客户端会话创建的一个对象,用于存储与该客户端相关的信息。可以说Session本质上也是一种特殊的Cookie,只不过它是包含会话ID的Cookie。
鉴权步骤如下:
优点:
缺点:
使用场景:适用于同域下的Web应用,对安全性要求不是极高,且不需要频繁进行跨域操作的场景。
Token是用户身份的一种验证方式,通常被称为“令牌”。当用户首次登录后,服务器生成一个Token并返回给客户端,此后客户端每次请求数据时,只需带上这个Token,无需再次携带用户名和密码。
最简单的Token组成包含:
也可以把一些不变的参数放进Token,减少查库次数。
验证流程如下:
优点:
缺点:
使用场景:广泛应用于前后端分离架构、分布式系统以及对安全性和扩展性要求较高的应用中。例如,许多移动应用的后端服务采用Token鉴权,方便客户端在不同设备、不同网络环境下进行访问。
JWT是一种特殊的Token,属于一种开放标准(RFC 7519),用于在网络应用中安全地传输信息。当服务器认证用户后,会生成一个JSON对象并发送给用户。之后,用户与服务器通信时,服务器完全依靠这个对象来认定用户身份。为防止用户篡改数据,服务器生成该对象时会加上签名。
JWT的数据结构:
JWT是一个很长的字符串,中间用点(.)分隔成三个部分,分别是Header(头部)、Payload(负载)、Signature(签名)。
{
"alg": "HS256",
"typ": "JWT"
}其中,alg属性表示签名的算法,默认是HMAC SHA256(写成HS256);typ属性表示这个令牌(token)的类型(type),JWT令牌统一写为JWT。头部的JSON对象会使用Base64URL算法转成字符串。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)优点:
缺点:
使用场景:常用于前后端分离的Web应用、单页应用(SPA)以及移动应用的身份验证和授权场景,尤其是在分布式系统和微服务架构中,因其无状态和易于扩展的特性而备受青睐。
单点登录允许用户只需登录一次,即可访问所有相互信任的应用系统。通常,SSO需要一个独立的认证中心(passport),子系统的登录均通过passport完成,子系统本身不参与登录操作。当一个系统成功登录后,passport会颁发一个令牌给各个子系统,子系统可凭借该令牌获取各自的受保护资源。为减少频繁认证,各个子系统在被passport授权后,会建立一个局部会话,在一定时间内无需再次向passport发起认证。
实现流程示例:
优点:
缺点:
使用场景:适用于企业内部多个相互关联的应用系统之间,或者大型互联网平台下的多个子业务系统之间,实现统一的用户登录和权限管理,提升用户体验和管理效率。例如,大型企业的办公系统,员工通过一次登录即可访问邮件系统、OA系统、文件管理系统等多个内部应用。
OAuth是目前最流行的授权机制,主要用于授权第三方应用获取用户数据。简单来说,OAuth就是一种授权机制,数据的所有者告知系统,同意授权第三方应用进入系统获取相关数据,系统会生成一个短期的进入令牌(token),第三方应用使用该令牌代替密码进行访问。
令牌与密码的差异:
OAuth 2.0的授权流程(以常见的授权码模式为例):
优点:
缺点:
使用场景:广泛应用于需要第三方应用接入的场景,如社交媒体平台允许第三方应用获取用户的部分信息(如头像、昵称等),以实现更丰富的功能。在互联网应用中,常见的“使用微信登录”“使用QQ登录”等功能,背后大多采用了OAuth 2.0授权机制。
在前后端分离的项目中,前端需要对用户的访问进行鉴权,以确保用户只能访问其有权限访问的页面。以Vue项目为例,我们可以使用路由守卫来实现前端鉴权。
什么是路由守卫:
路由守卫(Route Guard)是Vue.js中vue - router提供的一种功能,用于在路由切换时执行特定的逻辑,以控制和管理路由的访问。它类似于现实生活中的门卫,负责检查用户是否有权限进入某个区域(在这里指的是路由对应的页面或组件)。路由守卫可以在路由导航的不同阶段被调用,包括全局守卫、路由独享守卫和组件内守卫,通过它们可以实现诸如登录验证、权限控制、页面跳转控制等功能。
实现前端鉴权的步骤:
前端开发,鉴权方式,Token 鉴权,JWT,Session 鉴权,OAuth,OpenID Connect,Basic Auth,Bearer Token, 单点登录,跨域认证,权限管理,身份验证,API 安全,应用场景
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。