通过redis存值进行公共登录

有两个项目登录使用的是统一接口,并且域名相同,前端做同步登录

  1.  登录成功后获取userId,将userId加密为jmUserId存到cookie里面
  2. 此时还需要在ctx.session中存入登录信息userinfo
  3. 把同步登录需要的字段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));
  1. 在另一个项目里判断cookies中是否存在jmuserId,并进一步判断jmuserid属于本项目还是合并登录项目,并处理 无登录,另一项目退出登录,正常登录,同步项目登录四种状态
  2. 若既无userId也无token-----没有登录
  3. token有值,userinfo无值---同步项目退出登录
  4. userid存在,userinfo不为空---正常登录
  5. 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));
                        }

                    }

                }
            }

        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值