面试可能问的东西1

1.介绍下sso

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里有个优化策略,就是每次去系统A或者系统B,他们验证都需要去sso认证中心进行认证,浪费网络资源,如果能够生成一个系统A的tocken或者系统B的tocken则就不用每次去sso认证中心进行认证

2.介绍下jwt技术:

1.jwt技术生成一个加密的tocken,作为用户登陆的令牌,当用户登陆成功后,发送给客户端,请求需要登陆的资源或者接口,需要携带tocken,通过后端进行验证tocken是否合法
2.jwt有3部分组成:1.指定签名,固定好的{‘type’:‘JWT’,‘alg’:‘HS256’} 2.生成签发人,用户id 3.秘钥(自己设置)
在这里插入图片描述

3.wx扫码登陆+回调对应的地址

大致叙述整个过程

1.点击登陆,调用sso服务,获取微信登陆的二维码
2.sso服务根据微信提供的接口文档,生成二维码登陆,返回数据到前端
3.前端拿到链接,自动跳转微信登陆页面
4.手机授权扫码登陆
5.微信调用回调地址
6.回调到业务接口中:
a.如果用户存在则登陆,用户不存在注册
b.使用jwt技术生成tocken,同时存在cookie和redis中
c.需要记录用户的上次登陆信息,如果在其他机器登陆,则需要提掉线

数据库的设计

微信开放平台会关联web申请的账号,公众号,手机端这些,这三个账号是不同的,其中微信开放平台的账号的唯一的,对应数据库中微信unionid,微信的唯一标识以微信unionid为准
在这里插入图片描述

csrf跨站伪造攻击

wxMpService.buildQrConnectUrl这个方法有三个参数,一个是回调地址,一个是作用域,一个是csrfkey,其中这个csrf:跨站伪造攻击,回调链接中后面会有?state=csrfkey,需要验证csrfkey是不是我们存储的,如果是说明此链接是安全的不是伪造的
在这里插入图片描述

wx扫码扫码登陆的业务逻辑分析

1.获取一个csrfkey,然后在redis中存储
2.通过wxmpservice创建一个url地址,有3个参数,第一个是回调地址,第二个是作用域,第三个是csrf

在这里插入图片描述

回调的业务逻辑分析

前面有个回调地址参数验证

主要验证csrf是不是我们之前在redis当中存储的

doaction中的操作

1.通过code去获取access_tocken
2.通过code获取access_tocker,用access_tocken获取refresh_tocken,需要保存refresh_tocken在redis中,下次登陆的时候,如果refreshTocken存在则直接获取access_tocken,不需要用户重新授权
1.如果refreshtocken为null,则通过code获取access_tocken,通过access_tocken获取refresh_tocken,将refresh_tocken存储到redis中,过期时间设置为28天
2.如果refreshtocken不为null,则通过refreshtocken获取access_tocken
在这里插入图片描述

3.通过accesstocken获取微信的用户信息,(openid,unionid)其中openid就是微信用户的id,而unionid在web端,公众号端,手机端唯一。需要判断unionid在数据库user表中 是否存在 如果不存在,则注册;
在这里插入图片描述

4.使用jwt技术生产tocken,需要把tocken存储起来。提掉线功能(通过redisTemplate获得一个oldtocken,如果oldtocken!=null,则删除oldtocken)
在这里插入图片描述

5.返回给前端tocken,存在cookie中,下次请求的时候从cookie中获取tocken
在这里插入图片描述

在回调地址之后,是有一个测试的如下图

只要有tocken,说明就成功了,没有跳转页面,并且登陆那里没有变更微信头像,是因为下来要做一个用户的信息,登陆完成需要获取用户信息,才能完成前端页面的展示,需要拿上tocken来后端进行授权,上一步中,将tocken直接写到了cookie中,也就是从cookie拿到tocken来后端做验证,所以这里写了个登陆拦截,进行tocken认证,认证通过后
在这里插入图片描述

登陆拦截器

流程

1.实现登录拦截器,需要登录才能访问的接口,都会被拦截
2.要从cookie中拿到对应的token,通过request获取cookies数组,再遍历数组,找到对应的tocken
3.根据token去做对应的认证,认证通过,拿到userid。(这一步,分为两部分,一部分是检查tocken是否合法(JwtUtil.parseJWT),另一部分是判断redis中是否有tocken)通过try-catch一包,如果出现异常则拿不到了
    4.通过ThreadLocal将userid放入其中,后序的接口都可以通过threadlocal方便拿到用户id
package com.mszlu.xt.sso.handler
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建议阅读本文档的方式 本文档提供详细的目录,建议大家使用电脑阅读。如果大家用手机阅读的话,可以下载一个不错的PDF阅读器,比如 很多人常用的福昕PDF阅读器。 本文档提供详细的目录,大家可以根据自己的实际需要选择自己薄弱的知识章节阅读。 前言 不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有 章可循的,我这个“有章可循”说的意思只是说应对技术面试是可以提前准备。 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: 1. 自我介绍。(你可千万这样介绍:“我叫某某,性别,来自哪里,学校是那个,自己爱干什么”,记住:多说点简 历上没有的,多说点自己哪里比别人强!) 2. 自己面试可能涉及哪些知识点、那些知识点是重点。 3. 面试中哪些题会被经常到、面试中自己改如何回答。(强烈不推荐背题,第一:通过背这种方式你能记住多 少?能记住多久?第二:背题的方式的学习很难坚持下去!) 4. 自己的简历该如何写。 “80%的offer掌握在20%的人手中” 这句话也不是不无道理的。决定你面试能否成功的因素中实力固然占有很大一部 分比例,但是如果你的心态或者说运气不好的话,依然无法拿到满意的 offer。运气暂且不谈,就拿心态来说,千万 不要因为面试失败而气馁或者说怀疑自己的能力,面试失败之后多总结一下失败的原因,后面你就会发现自己会越来 越强大。 另外,大家要明确的很重要的几点是: 1. 写在简历上的东西一定要慎重,这可能面试官大量提的地方; 2. 大部分应届生找工作的硬伤是没有工作经验或实习经历; 3. 将自己的项目经历完美的展示出来非常重要。 笔主能力有限,如果有不对的地方或者和你想法不同的地方,敬请雅正、不舍赐教。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值