如何在智威汤逊中使用令牌吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强> JWT标记的组成强>
头部(头),格式如下:
{, “typ”:,“JWT”,, “alg”:,“HS256”, }
由上可知,该令牌使用HS256加密算法,将头部使用Base64编码可得到如下个格式的字符串:
eyJhbGciOiJIUzI1NiJ9
有效载荷(Playload):
{, “国际空间站”:,“Online JWT 建设者”,, “iat”:, 1416797419,, “实验”:,1448333419,, ……只 “标识”:10001, }
有效载荷中存放了令牌的签发者(iss),签发时间(iat),过期时间(exp)等以及一些我们需要写进牌中的信息。有效载荷也使用Base64编码得到如下格式的字符串:
eyJ1c2VyaWQiOjB9
签名(签名):
将标题和Playload拼接生成一个字符串str=" eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9”,使用HS256算法和我们提供的密钥(秘密,服务器自己提供的一个字符串)对str进行加密生成最终的JWT,即我们需要的令牌(令牌),形如:str。“签名字符串”。
<强>标记在服务与客户端的交互流程强>
1:客户端通过用户名和密码登录
2:服务器验证用户名和密码,若通过,生成牌返回给客户端。
3:客户端收到令牌后以后每次请求的时候都带上这个令牌,相当于一个令牌,表示我有权限访问了
4:服务器接收(通常在拦截器中实现)到该令牌,然后验证该令牌的合法性(为什么能验证下面说)。若该令牌合法,则通过请求,若令牌不合法或者过期,返回请求失败。
<强>关于令牌的思考强>
服务如何判断这个令牌是否合法?
由上面令牌的生成可知,令牌中的签名是由标题和有效载荷通过Base64编码生成再通过加密算法HS256和密钥最终生成签的名,这个签名位于JWT的尾部,在服务器端同样对返回过来的智威汤逊的前部分再进行一次签名生成,然后比较这次生成的签名与请求的智威汤逊中的签名是否一致,若一致说明牌合法。由于生成签名的密钥是服务器才知道的,所以别人难以伪造。
标记中能放敏感信息吗?
不能,因为有效载荷是经过Base64编码生成的,并不是加密,所以不能存放敏感信息。
<强>标记的优点强>
(1)相比于会话,它无需保存在服务器,不占用服务器内存开销。
(2)无状态,可拓展性强:比如有3台机器(A, B, C)组成服务器集群,若会话存在机器上,会话只能保存在其中一台服务器,此时你便不能访问机器B, C,因为B, C上没有存放该会话,而使用令牌就能够验证用户请求合法性,并且我再加几台机器也没的事,所以可拓展性好就是这个意思。
(3)由(2)知,这样做可就支持了跨域访问。
<强> Java实例:JWT牌使用强>
部分代码来自互联网,找不到原作者了。
编写智威汤逊(Java Web标记)操作类:JavaWebToken
public class JavaWebToken { private 才能static Logger  log =, LoggerFactory.getLogger (JavaWebToken.class);//才能该方法使用HS256算法和秘密:bankgl生成signKey private 才能static Key  getKeyInstance (), { ,,,//We will sign our JavaWebToken with our ApiKey 秘密 ,,,SignatureAlgorithm SignatureAlgorithm =, SignatureAlgorithm.HS256; ,,,byte [], apiKeySecretBytes =, DatatypeConverter.parseBase64Binary (“bankgl"); ,,,Key signingKey =, new SecretKeySpec (apiKeySecretBytes, signatureAlgorithm.getJcaName ()); ,,,return signingKey; ,,}//使才能用HS256签名算法和生成的signingKey最终的令牌,索赔中是有效载荷 public 才能static String  createJavaWebToken(字符串,Map