黄威的世界
2020-04-09
473浏览量
常规的是通过session
步骤:
JSESSIONID 只是一个钩子,用户信息其实存储在服务器端.
比如我在浏览器登录之后,重新打开一个标签页,输入相同的地址,仍然是登录状态,因为标签页共享cookie.
也就是说我只要获取到JSESSIONID ,就可以获取用户隐私信息,比如除用户名以外的其他信息(密码,姓名,年龄等).也可以做一些敏感操作,比如修改密码
浏览器发送请求时会带上cookie
这样服务器端才知道是否登录过:
例如,我获取到JSESSIONID 之后,使用HTTP模拟发送请求:
服务器端是如何判断是否登录
/***
* 判断是否已登录
* @param user2
* @return
*/
public static boolean isLogined(User user2,String loginFlag){
if(ValueWidget.isNullOrEmpty(user2)||ValueWidget.isNullOrEmpty(user2.getUsername())
||loginFlag == null
||( !loginFlag.equalsIgnoreCase(Constant2.FLAG_LOGIN_SUCCESS))){
return false;
}else{
return true;
}
}
/***
* 判断是否已登录
* @param session
* @return
*/
public static boolean isLogined(HttpSession session){
String loginFlag = (String) session
.getAttribute(Constant2.SESSION_KEY_LOGINED_FLAG);
User user2 = (User) session.getAttribute(Constant2.SESSION_KEY_LOGINED_USER);
return isLogined(user2,loginFlag);
}
这样的话,只要登录过,用户不主动清除cookie,那就一直是登录状态.
如果用户主动清除了cookie,那就不是登录状态了
详细流程,逻辑
(1)登录前,浏览器先向认证服务器请求一个OTP,认证服务器返回OTP,同时返回一个cookie给浏览器;
(2)认证服务器把OTP 和CCC(cookie) 挂钩;
(3)登录时连同带上OTP
(4)若登录成功,则认证服务器返回登录凭证(access token)给浏览器;
(5)认证服务器把CCC 和登录凭证挂钩;
(6)通过CCC 可以判断用户是否有权限.
所以,
(a)可以通过CCC 获取登录凭证
(b)也可以通过OTP 获取登录凭证
根本原因:服务器把OTP 和CCC(cookie) 挂钩
那么CCC记在什么地方?
浏览器
获取OTP的接口返回:
A和B是同一个公司的应用,
在同一个浏览器中登录了应用A ,就可以在该浏览器中直接访问应用B,而不用重新登录.
1,登录之前访问 认证系统的动态口令接口,获取动态口令:auth_token
同时会返回cookie:CCC ,目的:把浏览器和 auth_token 挂钩
等浏览器访问其他应用时,把该CCC带过去.
2,登录时参数包括(1)中返回的auth_token ;
3,访问应用B 时,浏览器会把cookie中的CCC传过去,应用B 拿到之后,给认证系统认证,判断是否登录;
若认证通过,则返回用户信息
同一个公司的应用,只需要登录一次。
比如我登录了阿里云,再打开淘宝 ,天猫或钉钉就不用重复登录(输入用户名和密码)。
小明登录了 Web应用A,再进入Web应用B时,不用重新输入用户名和密码,就自动登录了。
不用!!!
不用!!!
不用!!!
阿里云 和淘宝的域名就不一样
otp :one time password 就是一次一密
接口一:jsonp接口,获取 otp
请求方式:jsonp
获取 otp,同时可以判断是否已登录
http://auth.xxx.com/authentication/otp.jsonp?callbk=callbkMethod&clientId=应用的clientId
返回
{
"isLogined":true,
"otp":"433u23"
}
注意:jsonp 接口只需要 clientId,不需要 secret
接口二:使用 otp登录
请求方式:post
http://auth.xxx.com/authentication/login.json
/>参数:
username:
password:
otp:接口一获取的 otp
imgCode:图形验证码
返回:
{
"access_token":"",
"refresh_token":"",
"timeout":12000
...
}
接口三:opt 换取 access_token
请求方式:post
http://auth.xxx.com/authentication/token.json?secret=应用的secret&clientId=应用的clientId&opt=433u23
返回:
{
"access_token":"",
"refresh_token":"",
"timeout":12000
...
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
Java技术进阶成长,课程资料,案例解析,实战经验全都有!