JAVA中的令牌如何实现身份验证

  

JAVA中的令牌如何实现身份验证?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强>传统身份验证的方法

HTTP是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在饼干里,下次这个用户再向服务端发送请求的时候,可以带着这个饼干,这样服务端会验证一个这个饼干里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端.Cookie里面存的是sessionID是会话记录的ID。

上面说的就是会话,我们需要在服务端存储为登录的用户生成的会话,这些会话可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的会议。

<>强基于令牌的身份验证方法

使用基于令牌的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功后,服务端会签发一个令牌,再把这个令牌发送给客户端

客户端收到令牌以后可以把它存储起来,比如放在饼干里或者本地存储里

客户端每次向服务端请求资源的时候需要带着服务端签发的牌

服务端收到请求,然后去验证客户端请求里面带着的令牌,如果验证成功,就向客户端返回请求的数据JWT

实施令牌验证的方法挺多的,还有一些标准方法,比如JWT,读作:记,表示:JSON Web标记.JWT标准的令牌有三个部分:

<代码>头

<代码>有效载荷

<代码>签名

中间用点分隔开,并且都会使用Base64编码,所以真正的令牌看起来像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ。SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

<代码>头

页眉部分主要是两部分内容,一个是令牌的类型,另一个是使用的算法,比如下面类型就是JWT,使用的算法是HS256。

{   “typ":“JWT"   “alg":“HS256"   }

上面的内容要用Base64的形式编码一下,所以就变成这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

<代码>有效载荷

有效载荷里面是令牌的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。

下面是标准字段:

空间站:发行人,发行者子:主题,主题aud:观众,观众exp:过期时间,过期时间nbf:不是iat:之前发出,发行时间jti: JWT ID

比如下面这个有效载荷,用到了空间站发行人,还有经验过期时间。另外还有两个自定义的字段,一个是名字,还有一个是admin。

{   “iss":“ninghao.net"   “exp":“1438955445”,   “name":“wanghao"   “admin":没错   }

使用Base64编码以后就变成了这个样子:

eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ

<代码>签名

JWT的最后一部分是签名,这部分内容有三个部分,先是用Base64编码的头。有效载荷,再用加密算法加密一下,加密的时候要放进去一个秘密,这个相当于是一个密码,这个密码秘密地存储在服务端。

<代码>头

<代码>有效载荷

<代码>秘密

var encodedString=base64UrlEncode(头)+“!”+ base64UrlEncode(载荷);

HMACSHA256 (encodedString & # 39;秘密# 39;);

<强>处理完成以后看起来像这样:

SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

最后这个在服务端生成并且要发送给客户端的令牌看起来像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ。SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

JAVA中的令牌如何实现身份验证