有两个项目登录使用的是统一接口,并且域名相同,前端做同步登录
- 登录成功后获取userId,将userId加密为jmUserId存到cookie里面
- 此时还需要在ctx.session中存入登录信息userinfo
- 把同步登录需要的字段token存在redis里面,并用加密的userId做key
//登陆成功后加密userid
const jmUserId = Base64.encode(datalist.MEMBER_ID);
ctx.session.com_AStip = jmUserId;
// 加密后的userid存到cookie共用
ctx.cookies.set('com_AStip', jmUserId, {
maxAge: 24 * 3600 * 1000 * 7, //保存七天
// maxAge: 24 * 3600 * 1000,
httpOnly: true, // by default it's true
domain: ctx.session.sessionDomainUrl
});
// 根据userid存相关信息到redis
const userMes = {
access_token: ctx.session.token2,
}
ctx.logger.info("用户信息接口cookie========", jmUserId, JSON.stringify(userMes));
await ctx.app.redis.set(jmUserId, JSON.stringify(userMes));
- 在另一个项目里判断cookies中是否存在jmuserId,并进一步判断jmuserid属于本项目还是合并登录项目,并处理 无登录,另一项目退出登录,正常登录,同步项目登录四种状态
- 若既无userId也无token-----没有登录
- token有值,userinfo无值---同步项目退出登录
- userid存在,userinfo不为空---正常登录
- userid存在,userinfo为空---同步登录
if (com_AStip == undefined || com_AStip == null) { // cookie里共用用户信息不存在
ctx.logger.info('回调token', ctx.session.token,
ctx.session.userInfo,ctx.session.userinfo)
if (ctx.session.token != null && ctx.session.userInfo.username != undefined) {
//合并项目退出登录
// 清除session 退出登录
ctx.cookies.set('com_AStip', null, {
domain: ctx.session.sessionDomainUrl
}); // 此句要在用户手动退出登录时执行
ctx.session.userinfo = {};
ctx.session.userInfo = {};
ctx.session.loginstate = false;
ctx.session.loginstate_user = false;
ctx.session.token = "";
ctx.session.token2 = "";
} else { // 没有用户登录 不做处理
ctx.logger.info('没有用户登录 不做处理')
}
} else { // cookie里有userid
if (ctx.session.userInfo && JSON.stringify(ctx.session.userInfo) != "{}") {
//正常的账号登陆
// 判断别的网站有没有用户退出了又再登录 切换为最后登录的用户
const com_AStip2 = ctx.session.com_AStip;
if (com_AStip != com_AStip2) {
ctx.logger.info('两个账号登录=======', com_AStip, com_AStip2);
// 以浏览器的加密userid为准 执行情况四的自动登录 com_AStip
// 取浏览器加密的userid作为key 在redis取用户信息 拿到用户信息重新执行登录
const data_x = await ctx.app.redis.get(com_AStip); // 根据key取用户信息
const usermes = JSON.parse(data_x)
ctx.logger.info('用户信息json', usermes)
ctx.session.token = "bearer " + usermes.access_token;
ctx.session.token2 = usermes.access_token;
ctx.session.com_AStip = ctx.cookies.get('com_AStip');
const result = await ctx.service.login.login.userLogin_token();
ctx.logger.info('token回调信息', result)
ctx.session.userInfo = {
id: result.data.id,
userId: result.data.userId,
phone: result.data.phone
}
const params_user = {
memberType: 1,
phone: result.data.username,
userId: result.data.userId,
id: result.data.userId,
}
ctx.logger.info('用户个人信息', params_user);
const result_user = await
ctx.service.login.login.isHaveUser(params_user);
if (result_user.data.code == '0000') {
const result_info = await
ctx.service.login.login.memberInformation(params_user);
ctx.logger.info('用户个人信息', result_info);
if (result_info.data.code == '0000' && result_info.data.data != undefined) {
const datalist = result_info.data.data;
ctx.session.loginstate_user = true;
ctx.session.userInfo.username = datalist.MEMBER_NAME;
ctx.session.userInfo.userImg = datalist.IMG;
ctx.session.userInfo.isMember = datalist.IS_MEMBER;
ctx.session.userInfo.taxNum = datalist.TAX_NUM;
ctx.session.userInfo.loginType = datalist.MEMBER_TYPE;
ctx.session.userInfo.custId = datalist.CUSTID;//会员id-非会员没有
ctx.logger.info("用户信息接口userInfo========", ctx.session.userInfo);
//登陆成功后加密userid
const jmUserId = Base64.encode(datalist.MEMBER_ID);
ctx.session.com_AStip = jmUserId;
const jmtoken = Base64.encode(ctx.session.token2);
const jmphone = Base64.encode(datalist.PHONE);
ctx.cookies.set("SESSION_ID", "r1kd-AywU_j4zSTFVdxQqWCan77YskZHxjObzJjEi7knSExeFI234s_nkCUmeCyC", {
maxAge: 3600 * 24 * 1000,
expires: 1,
httpOnly: true, // by default it's true
encrypt: true, // 加密,并且可以设置为中文
});
// 加密后的userid存到cookie共用
ctx.cookies.set('com_AStip', jmUserId, {
maxAge: 24 * 3600 * 1000 * 7, //保存七天
// maxAge: 24 * 3600 * 1000,
httpOnly: true, // by default it's true
domain: ctx.session.sessionDomainUrl
});
ctx.cookies.set('com_UserId', jmUserId, {
maxAge: 24 * 3600 * 1000 * 1, //保存1天
expires: 1,
httpOnly: false, // by default it's true
encrypt: false, // 加密,并且可以设置为中文
domain: ctx.session.sessionDomainUrl
});
ctx.cookies.set('com_Token', jmtoken, {
maxAge: 24 * 3600 * 1000 * 1, //保存1天
expires: 1,
httpOnly: false, // by default it's true
encrypt: false, // 加密,并且可以设置为中文
domain: ctx.session.sessionDomainUrl
});
ctx.cookies.set('com_Phone', jmphone, {
maxAge: 24 * 3600 * 1000 * 1, //保存1天
expires: 1,
httpOnly: false, // by default it's true
encrypt: false, // 加密,并且可以设置为中文
domain: ctx.session.sessionDomainUrl
});
// 根据userid存相关信息到redis
const userMes = {
access_token: ctx.session.token2,
}
ctx.logger.info("用户信息接口cookie========", jmUserId, JSON.stringify(userMes));
await ctx.app.redis.set(jmUserId, JSON.stringify(userMes));
}
}
}
ctx.logger.info('情况3-正常的账号登陆', ctx.session.loginstate_user)
// //判断token过期的情况
// const tokenParams = {
// userId: ctx.session.userInfo.userId
// }
// const tokenresult = await ctx.service.searchBox.myIntegral(tokenParams);
// if (tokenresult.status == '200') {
// ctx.logger.info('token有效2222==================================')
// } else {
// ctx.logger.info('token失效3333==================')
// ctx.cookies.set('com_AStip', null, {
// domain: ctx.session.sessionDomainUrl
// }); // 此句要在用户手动退出登录时执行
// ctx.session.userInfo = {};
// ctx.session.loginstate_user = false;
// ctx.session.token = "";
// ctx.session.token2 = "";
// ctx.logger.info('ctx.request.url==================================', ctx.request.url)
// ctx.redirect('/user_logout');
// return
// }
} else { //合并页面带cookie数据跳转登陆
ctx.logger.info('情况4-合并页面带cookie数据跳转登陆/浏览器cookie还存有com_AStip')
const data_x = await ctx.app.redis.get(com_AStip);
const usermes = JSON.parse(data_x)
ctx.logger.info('用户信息json', usermes)
//判断redis
if (usermes == null || usermes.access_token == undefined) { // 取不到redis信息
// 清除session 退出登录
ctx.cookies.set('com_AStip', null, {
domain: ctx.session.sessionDomainUrl
}); // 此句要在用户手动退出登录时执行
ctx.session.userinfo = {};
ctx.session.loginstate = false;
ctx.session.loginstate_user = false;
ctx.session.token = "";
ctx.session.token2 = "";
ctx.session.com_AStip = "";
} else {
ctx.session.token = "bearer " + usermes.access_token;
ctx.session.token2 = usermes.access_token;
ctx.session.com_AStip = ctx.cookies.get('com_AStip');
const result = await ctx.service.login.login.userLogin_token();
ctx.logger.info('token回调信息', result.data)
ctx.session.userInfo = {
id: result.data.id,
userId: result.data.userId,
phone: result.data.phone
}
const params_user = {
memberType: 1,
phone: result.data.username,
userId: result.data.userId,
id: result.data.userId,
}
const result_user = await ctx.service.login.login.isHaveUser(params_user);
ctx.logger.info('用户个人信息', result_user);
if (result_user.data.code == '0000') {
const result_info = await ctx.service.login.login.memberInformation(params_user);
ctx.logger.info('用户个人信息', result_info);
if (result_info.data.code == '0000' && result_info.data.data != undefined) {
const datalist = result_info.data.data;
ctx.session.loginstate_user = true;
ctx.session.userInfo.username = datalist.MEMBER_NAME;
ctx.session.userInfo.userImg = datalist.IMG;
ctx.session.userInfo.isMember = datalist.IS_MEMBER;
ctx.session.userInfo.taxNum = datalist.TAX_NUM;
ctx.session.userInfo.loginType = datalist.MEMBER_TYPE;
ctx.session.userInfo.custId = datalist.CUSTID;//会员id-非会员没有
ctx.logger.info("用户信息接口userInfo========", ctx.session.userInfo);
//登陆成功后加密userid
const jmUserId = Base64.encode(datalist.MEMBER_ID);
ctx.session.com_AStip = jmUserId;
const jmtoken = Base64.encode(ctx.session.token2);
const jmphone = Base64.encode(datalist.PHONE);
ctx.cookies.set("SESSION_ID", "r1kd-AywU_j4zSTFVdxQqWCan77YskZHxjObzJjEi7knSExeFI234s_nkCUmeCyC", {
maxAge: 3600 * 24 * 1000,
expires: 1,
httpOnly: true, // by default it's true
encrypt: true, // 加密,并且可以设置为中文
});
// 加密后的userid存到cookie共用
ctx.cookies.set('com_AStip', jmUserId, {
maxAge: 24 * 3600 * 1000 * 7, //保存七天
// maxAge: 24 * 3600 * 1000,
httpOnly: true, // by default it's true
domain: ctx.session.sessionDomainUrl
});
ctx.cookies.set('com_UserId', jmUserId, {
maxAge: 24 * 3600 * 1000 * 1, //保存1天
expires: 1,
httpOnly: false, // by default it's true
encrypt: false, // 加密,并且可以设置为中文
domain: ctx.session.sessionDomainUrl
});
ctx.cookies.set('com_Token', jmtoken, {
maxAge: 24 * 3600 * 1000 * 1, //保存1天
expires: 1,
httpOnly: false, // by default it's true
encrypt: false, // 加密,并且可以设置为中文
domain: ctx.session.sessionDomainUrl
});
ctx.cookies.set('com_Phone', jmphone, {
maxAge: 24 * 3600 * 1000 * 1, //保存1天
expires: 1,
httpOnly: false, // by default it's true
encrypt: false, // 加密,并且可以设置为中文
domain: ctx.session.sessionDomainUrl
});
// 根据userid存相关信息到redis
const userMes = {
access_token: ctx.session.token2,
}
ctx.logger.info("用户信息接口cookie========", jmUserId, JSON.stringify(userMes));
await ctx.app.redis.set(jmUserId, JSON.stringify(userMes));
}
}
}
}
}