一口气说出前后端10种鉴权方案~腾讯云开发者社区

白话文的意思就是:你需要用身份证证明你自己是你自己。

比如我们常见的认证技术:

在现实生活领域:门禁卡需要通过门禁卡识别器,银行卡需要通过银行卡识别器;

在互联网领域:校验session/cookie/token的合法性和有效性

权限控制(Access/PermissionControl)将可执行的操作定义为权限列表,然后判断操作是否允许/禁止

对于权限控制,可以分为两部分进行理解:一个是权限,另一个是控制。权限是抽象的逻辑概念,而控制是具体的实现方式。

在现实生活领域中:以门禁卡的权限实现为例,一个门禁卡,拥有开公司所有的门的权限;一个门禁卡,拥有管理员角色的权限,因而可以开公司所有的门。

在互联网领域:通过web后端服务,来控制接口访问,允许或拒绝访问请求。

前端鉴权

需要说明的是,这四个环节在有些时候会同时发生。例如在下面的几个场景:

既然我们已经了解了他们之间的关系,那么我们应该好好讲讲关于前端鉴权有哪些?以及他们之间存在的差异点又在哪里呢?

在HTTP中,基本认证方案(BasicAccessAuthentication)是允许客户端(通常指的就是网页浏览器)在请求时,通过用户提供用户名和密码的方式,实现对用户身份的验证。

“因为几乎所有的线上网站都不会走该认证方案,所以该方案大家了解即可”

1.1认证流程图

HTTP基本鉴权

客户端(如浏览器):向服务器请求一个受限的列表数据或资源,例如字段如下

GET/list/HTTP/1.1Host:www.baidu.comAuthorization:BasicaHR0cHdhdGNoOmY=复制代码服务器:客户端你好,这个资源在安全区baidu.com里,是受限资源,需要基本认证;

其中Basic就是验证的模式,而realm="baidu.com"说明客户端需要输入这个安全域的用户名和密码,而不是其他域的

HTTP/1.1401Unauthorizedwww-Authenticate:Basicrealm="baidu.com"复制代码客户端:服务器,我已经携带了用户名和密码给你了,你看一下;(注:如客户端是浏览器,那么此时会自动弹出一个弹窗,让用户输入用户名和密码);

输入完用户名和密码后,则客户端将用户名及密码以Base64加密方式发送给服务器

传送的格式如下(其中Basic内容为:用户名:密码的ase64形式):

GET/list/HTTP/1.1Authorization:BasicKsid2FuZzp3YW5n==复制代码服务器:客户端你好,我已经校验了Authorization字段你的用户名和密码,是正确的,这是你要的资源。

HTTP/1.1OK...复制代码1.3优点简单,基本所有流行的浏览器都支持

内部网络,或者对安全要求不是很高的网络。

Session-Cookie认证是利用服务端的Session(会话)和浏览器(客户端)的Cookie来实现的前后端通信认证模式。

在理解这句话之前我们先简单了解下什么是Cookie以及什么是Session?

众所周知,HTTP是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息);

所以为了让服务器区分不同的客户端,就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态可以通过Cookie去实现。

特点:

Session的抽象概念是会话,是无状态协议通信过程中,为了实现中断/继续操作,将用户和服务器之间的交互进行的一种抽象;

具体来说,是服务器生成的一种Session结构,可以通过多种方式保存,如内存、数据库、文件等,大型网站一般有专门的Session服务器集群来保存用户会话;

原理流程:

与Cookie的差异:

“看到这里可能就有同学想到了,Session-Cookie是不是就是把Session存储在了客户端的Cookie中呢?Bingo,的确是这样的,我们接着往下看”

Session-Cookie的认证流程图

现在我们已经得知,Session-Cookie的一些缺点,以及Session的维护给服务端造成很大困扰,我们必须找地方存放它,又要考虑分布式的问题,甚至要单独为了它启用一套Redis集群。那有没有更好的办法?

那Token就应运而生了

Token是一个令牌,客户端访问服务器时,验证通过后服务端会为其签发一张令牌,之后,客户端就可以携带令牌访问服务器,服务端只需要验证令牌的有效性即可。

一句话概括;访问资源接口(API)时所需要的资源凭证

一般Token的组成:

Token的认证流程图:

Token的认证流程图

Token认证步骤解析:

Token的优点:

Token的缺点:

业务接口用来鉴权的Token,我们称之为AccessToken。

为了安全,我们的AccessToken有效期一般设置较短,以避免被盗用。但过短的有效期会造成AccessToken经常过期,过期后怎么办呢?

另外一种办法是:再来一个Token,一个专门生成AccessToken的Token,我们称为RefreshToken;

RefreshToken的认证流程图:

RefreshToken的认证流程图

RefreshToken认证步骤解析:

Session-Cookie和Token有很多类似的地方,但是Token更像是Session-Cookie的升级改良版。

“如果你的用户数据可能需要和第三方共享,或者允许第三方调用API接口,用Token。如果永远只是自己的网站,自己的App,用什么就无所谓了。”

通过第三节,我们知道了Token的使用方式以及组成,我们不难发现,服务端验证客户端发送过来的Token时,还需要查询数据库获取用户基本信息,然后验证Token是否有效;

这样每次请求验证都要查询数据库,增加了查库带来的延迟等性能消耗;

那么这时候业界常用的JWT就应运而生了!!!

JWT由三部分组成:Header头部、Payload负载和Signature签名

它是一个很长的字符串,中间用点(.)分隔成三个部分。列如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c复制代码Header头部:

在Header中通常包含了两部分:

{"alg":"HS256","typ":"JWT"}复制代码Payload负载:

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。

{"sub":"1234567890","name":"JohnDoe","admin":true}复制代码Signature签名

Signature部分是对前两部分的签名,防止数据篡改。

首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用Header里面指定的签名算法(默认是HMACSHA256),按照下面的公式产生签名。

HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)复制代码4.3JWT的使用方式客户端收到服务器返回的JWT,可以储存在Cookie里面,也可以储存在localStorage。

此后,客户端每次与服务器通信,都要带上这个JWT。你可以把它放在Cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP请求的头信息Authorization字段里面。

Authorization:Bearer复制代码4.4JWT的认证流程图其实JWT的认证流程与Token的认证流程差不多,只是不需要再单独去查询数据库查找用户用户;简要概括如下:

JWT的认证流程图的副本

当百度网站存在两个相同主域名下的贴吧子系统tieba.baidu.com和网盘子系统pan.baidu.com时,以下为他们实现SSO的步骤:

CAS认证流程图

“到这里客户端就可以跟系统A愉快的交往啦~”

“(PS:脚踏两只船,感觉有点渣呀~)”

令牌与密码的差异:

令牌(Token)与密码(Password)的作用是一样的,都可以进入系统,但是有三点差异。

客户端:

网站A服务器:

收到请求以后,验证通过,就会颁发令牌。具体做法是向redirect_uri指定的网址,发送一段JSON数据。

{"access_token":"ACCESS_TOKEN","token_type":"bearer","expires_in":,"refresh_token":"REFRESH_TOKEN","scope":"read","uid":,"info":{...}}复制代码上面JSON数据中,access_token字段就是令牌,A网站在后端拿到了,然后返回给客户端即可。

“注意:

如果你高度信任某个应用,OAuth2.0也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。

一句话概括:用户在客户端提交账号密码换token,客户端使用token访问资源。

注意,这时不需要跳转,而是把令牌放在JSON数据里面,作为HTTP回应,A网站因此拿到令牌。

主要适用于没有前端的命令行应用。

一句话概括:客户端使用自己的标识换token,客户端使用token访问资源。

“注意:这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。”

模式

需要前端

需要后端

需要用户响应

需要客户端密钥

这样的概念其实与上面所讲的OAuth2.0的用户名密码式模式认证方式类似。

—身为优秀的程序员的我们当然是满足他啦!!

用户在客户端A操作:

用户在客户端B操作:

二维码又称二维条码,常见的二维码为QRCode,QR全称QuickResponse,是一个近几年来移动设备上超流行的一种编码方式,它比传统的BarCode条形码能存更多的信息,也能表示更多的数据类型。

待扫码阶段:

已扫码待确认阶段:

已确认阶段:

缺点:

直到手机卡的强制实名制才得以解决!

随着无线互联的发展以及手机卡实名制的推广,手机号俨然已成为特别的身份证明,与账号密码相比,手机号可以更好地验证用户的身份,防止恶意注册。

我们想一下,为什么我们需要验证码?验证码的作用就是确定这个手机号是你的,那除了使用短信,是否还有别的方式对手机号进行认证?

THE END
1.国外手机号java验证外国手机验证码平台这里需要填写可以接收短信验证码的国外手机号码,也可以用 SMS-Activate 接码平台 提供的国外手机号接收验证码,需要注意的是,注册接码平台不要使用临时邮箱,避免因为遗忘密码造成损失。 SMS-Activate 接码平台 的一次性国外手机号的激活有效时长是20分钟,只有在接收到短信验证码才产生费用,因此无需担心多次尝试而导致的https://blog.51cto.com/u_16099254/11727641
2.手机绑定游戏角色,随时随地保驾护航!答:需要登陆游戏长安城(335,105)找“大唐驿使”NPC,根据提示将之前的手机号码绑定角色取消,然后再重新绑定新的手机号码。 3、如果手机没有电池或者丢失了,或者手机卡坏了,我如何去解锁游戏角色? 答:首先登陆http://sms.nie.163.com,通过您曾注册密保的手机号码和手机验证码进行解锁游戏角色,即可进入游戏。 https://xyq.163.com/news/2005/06/2-2-20050621132204.html
3.只填手机号网上轻松注册新闻台很多读者输入法功力不够,不少邮箱网站推出了“手机邮箱”功能。在“网址大全”中点击邮箱网站,再点击注册,将您的手机号敲到邮箱名称一栏中即可。网站会通过向您手机发送验证码来建立手机与邮箱的“唯一性”关系。最后设置一个密码,您的手机邮箱就搞定了。而且名称简单易记、忘记密码后还能短信提示。http://news.cntv.cn/20120404/113815.shtml
4.可以通过手机号码起诉么专家导读 从《最高人民法院关于适用〈中华人民共和国民事诉讼法〉的解释》中了解到,去法院起诉的,要求提供被告的姓名或者名称、住所等信息具体明确。如果仅仅只有被告的手机号码,此时无法确认明确的被告人,因此起诉之后是不会立案。 可以通过手机号码起诉么 一、可以通过手机号码起诉么 只有被告的的电话号,没有被告的https://mip.64365.com/zs/1149956.aspx
5.手机号在线读取接收短信息注册码/验证码网站大全互联网时代的到来,让 Email(邮箱)和 Sms(短信验证码)都是应用提供者用来验证来访者身份的主要途径。在有些时候,我们并不希望被强迫的留下真实信息,以免被无穷尽的骚扰。这时候,我们可以用一些办法,尽量避免验证。比如注册时使用一些用完即走的临时邮箱来收取邮件验证,手机方面有临时手机号码可以使用。能保证不被骚扰https://www.jianshu.com/p/b2553f8974f4
6.注销手机号我们应注意什么?“大平台安全机制和防护手段相对完善,小网站、小应用数量庞大,应是注意的重点。”电信分析师付亮表示,很多小型应用大家可能只在注册时认证和使用过,之后忘记的可能性很大。目前,还没有较为有效的技术手段能够一次性解绑各类应用。 专家建议,普通人在生活中用手机验证时应多留个心眼,尽量减少不必要的http://www.xinhuanet.com/info/20240409/2f43dd3f757c4de99e0d68af6dfba9d7/c.html
7.国外的手机号怎么注册百度帐户呢?- 如果您使用邮箱注册,请确保输入正确的邮箱地址和验证码。- 请妥善保管您的账号信息,不要泄露给他人https://ask.zol.com.cn/x/18815562.html
8.登录谷歌账号提示此电话号码已用过太多次,显示手机号验证次数过多无法登有的朋友在第一次注册谷歌账号,并且谷歌邮箱登陆的时候,可能会遇到一些问题,比如网络加载不出来,收到验证码输入后下一步显示404错误等。如果你在第二次尝试注册时出现了“此号码验证次数过多,请使用其他手机号”的提示,实际上这是谷歌建议你更换电话号码进行注册。 https://blog.csdn.net/creouser/article/details/139568551
9.手机号免费获取验证码怎么获得真实手机号码现在互联网上很多账号都需要用到手机号注册。这样如果我们想要注册两个账号的话,就会出现手机号不够用的情况。我们用自己家人的账号的时候,总是感觉到不是很方便。那么有没有办法我们自己免费获取一个真实的手机号呢?善良的野诸结合自己自身的经验,来解决这个问题。工具/原料 手机 方法/步骤 1 1.手机是不可能平https://jingyan.baidu.com/article/c275f6ba03a56de33d7567d5.html