登录chatgpt时验证身份遇到问题 使用会话Cookie和JWT身份验证
顶级算法后台回复1024有特别礼包
责编:顶级算法 | 来源:网络
上一篇精彩:程序员大部分时间不是写代码,而是。。。 大家好,我是顶级算法。
HTTP是无状态协议,用于传输数据。它启用了客户端和服务器端>之间的通信。它最初是为了在Web浏览器和Web服务器之间建立连接而建立的。比如在网上购物,我们添加一些商品,例如。耳机到我们的购物车,然后,我们继续寻找其他项目,在此期间,我们希望在执行任何其他任务是存储购物车项目的状态且不丢失它们。这意味着我们希望在整个购物过程中记住我们的状态。由于HTTP是无状态协议,因此要克服问题,我们可以使用会话或者令牌
1、基于会话的身份验证
在JSON Web令牌出现之前,我们主要使用这种身份验证。在这种身份验证中,服务器负责身份验证,客户端不知道发送请求后服务器端会发生什么。
那么什么是会话?
由于客户端未指定(过期时间)或Max-Age(最大上限)指令,因此在客户端关闭时将其删除。但是,Web浏览器可能会使用会话还原,这会使大多数会话永久保持状态,就像从未关闭过浏览器一样。
用户在网络浏览器上登录网站发生什么。例如,用户登录后,服务器 将为该用户创建一个会话并将该会话数据存储在服务器内存中。当用户在网站上执行某些活动时,会创建一个会话ID,该会话ID存储在客户端浏览器的中。在用户提出的每个请求中,都将随之发送。然后,当用户最初登录时,服务器可以使用存储在服务器内存中的会话数据来验证上的会话数据。当用户从网站注销时,该会话数据将从数据库和服务器内存中删除。
2、基于令牌的身份验证
在基于令牌的身份验证中,我们使用JWT(JSON Web )进行身份验证。这是 API的广泛使用方法。
当用户发送带有登录详细信息的用户身份验证请求时,服务器将以JSON WEB (JWT)的形式创建一个加密的令牌,并将其发送回客户端。当客户端收到令牌时,这意味着该用户以通过身份验证,可以使用客户端执行任何活动。
JWT通常存储在客户端的中,当用户从服务器请求任何数据或对该网站执行任何活动时,JWT将作为该用户的唯一密钥发送。因此,当服务器接收到该请求时,它将针对每个请求验证JWT仅是该特定用户,然后将所需的响应发送回客户端。
.("key", "value");
用户状态存储在客户端JWT中。当用户注销时,令牌将从客户端()中删除。因此,大多数数据存储在客户端,并且可以直接访问,而不是向服务器发送请求。
JSON WEB 由(.)连接的三个部分组成:
1.标头
2.有效载荷
3.签名
JWT结构:
xxxxx.yyyyy.zzzzz
输出包含三个由点分割的-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。
JWT已对先前的标头和有效负载进行了编码,并用一个密钥进行签名,如下
哪个更好用?
在现代Web应用程序中,JWT被广泛使用,因为它的伸缩性优于基于会话的,因为令牌存储在客户端,而会话使用服务器内存来存储用户数据,这可能是一个大问题。大量用户一次访问应用程序。由于JWT是随着每个请求一起发送的,而且包含所有用户信息,因此即使对JWT进行了编码,也有必要在JWT中使用必要的信息,并且应避免使用敏感信息或者将其加密以防止安全攻击。
没有固定的方法可以始终使用,它取决于开发人员和要求的类型,以找出在哪种情况下需要使用哪种方法。
3、jwt实现登录
//定义JWT的有效时长七天
private static final long EXPIRE_TIME = 60 * 1000 * 60 * 24 * 7;
//签发人
private static String ISSUER = "K_ang";
/*秘钥*/
private static final String SING = "K*&^A%$#N@!G";
/**
* 生成令牌
*
* @param map
* @return
*/
public static String getToken(Map map) {
//设置过期时间
Date date = null;
try {
date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
//创建token
JWTCreator.Builder builder = JWT.create()
.withIssuer(ISSUER)
.withExpiresAt(date);
//添加信息
map.forEach((k, v) -> {
builder.withClaim(k, v);
});
return builder.sign(Algorithm.HMAC256(SING));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 验证token
*
* @param token
*/
public static boolean verify(String token, String userNo) {
try {
//设置加密算法
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SING)).withClaim("userNo", userNo).build();
//校验token
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e) {
return false;
}
}
/**
* 获取token信息方法
*
* @param
* @return
*/
public static String getTokenInfo(String token) {
DecodedJWT decode = JWT.decode(token);
return decode.getClaim("userNo").asString();
}
}
@PostMapping("/login")
public Result login(@PathParam("empNo") String empNo, @PathParam("empPassword") String empPassword) {
if (empNo == null || "".equals(empNo)) {
return ResultUtil.error(103, "请输入用户名,用户名不能为空");
}
if (empPassword == null || "".equals(empPassword)) {
return ResultUtil.error(103, "请输入密码,密码不能为空");
}
Emp emp = empService.login(empNo, empPassword);
if (emp == null) {
return ResultUtil.error(103, "用户不存在,获取token失败");
}
if (emp.getEmpPassword() == null || !emp.getEmpPassword().equals(empPassword)) {
return ResultUtil.error(103, "密码错误,获取token失败");
}
//正常token
String token = JwtUtils.sign(empNo, empPassword);
emp.setToken(token);
return ResultUtil.success(200, "登录成功", emp);
}
为了跟上AI时代我干了一件事儿,我创建了一个知识星球社群:与副业。想带着大家一起探索和新的AI时代。
有很多小伙伴搞不定账号,于是我们决定,凡是这三天之内加入的小伙伴,我们直接送一个正常可用的永久独立账户。
不光是增长速度最快,我们的星球品质也绝对经得起考验,短短一个月时间,我们的课程团队发布了8个专栏、18个副业项目:
简单说下这个星球能给大家提供什么:
1、不断分享如何使用来完成各种任务,让你更高效地使用,以及副业思考、变现思路、创业案例、落地案例分享。
2、分享的使用方法、最新资讯、商业价值。
3、探讨未来关于的机遇,共同成长。
4、帮助大家解决遇到的问题。
5、提供一整年的售后服务,一起搞副业
星球福利:
1、加入星球4天后,就送独立账号。
2、邀请你加入会员交流群。
3、赠送一份完整的手册和66个副业赚钱手册。
其它福利还在筹划中...不过,我给你大家保证,加入星球后,收获的价值会远远大于今天加入的门票费用 !
本星球第一期原价399,目前属于试运营,早鸟价169,每超过50人涨价10元,星球马上要来一波大的涨价,如果你还在犹豫,可能最后就要以更高价格加入了。。
早就是优势。建议大家尽早以便宜的价格加入!
排序序列:
2、
3、
4、
5、
6、
7、
8、
觉得不错?欢迎转发分享给更多人
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 10T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
扫码回复【面试题】即可获取 公众号后台回复算法或者算法心得有惊喜礼包!
顶级算法交流群
「顶级算法」建立了读者算法交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。
扫描添加好友邀你进算法群,加我时注明【姓名+公司+职位】