登录模块:
SSO单点登录:
单点登录一般常用的有三种情况
第一种方式:session广播机制
第二种方式:采用cookie + redis 来实现
思路:采用redis来生成一个随机值的 key,value则存放用户信息数据,然后将redis生成的key放入到cookie中,在当前项目访问其他模块的时候,发送的请求里面带着cookie,在接受端的模块中获取请求中的cookie值,找到对应的key值,然后再去redis中查询,是否存在数据,如果存在则表明已经登录。
第三种方式:采用token方式实现
思路:在项目中的登录模块进行登录后,按照某种规则生成字符串,把登录之后的用户信息包含到生成的字符串中,然后将字符串返回。其中包含两种方式:一是可以把字符串通过cookie返回,二是可以将字符串通过地址栏返回两种方式。
当我们再去访问其他的模块的时候,每次访问的时候地址栏带着生成的字符串,然后再访问的模块里面获取地址栏的字符串,根据字符串获取用户信息,如果能获取到则表明该用户已经登录了。
Token字符串是如何生成的?
采用JWT生成token字符串
JWT生成的字符串由三个部分组成:第一部分:JWT头信息 第二部分:有效载荷(包含用户信息) 第三部分:签名哈希
登录具体流程:
1.调用接口返回token字符串
2.将返回的字符串存放到cookie中
3.创建前端拦截器--判断cookie中是否有token字符串,如果有的话,将token字符串放入到header中(请求头中)
4.根据token字符串调用接口,返回用户信息,为了首页显示用户信息,然后将调用接口返回的用户信息存放到cookie中。
微信扫描登录:
OAuth2:它是一种特定问题的解决方案。主要解决:开放系统间授权和分布式访问
它的解决方案是采用了令牌机制,按照一定规则生成字符串,字符串中要包含用户信息。
可以说OAuth2就像一个接口一样,它只是指定要按照某钟规则生成字符串,而没有给出具体的生成字符串的策略,而JWT则是它的具体实现,能够生成具体的字符串,并且字符串中包含了用户信息。
如何通过微信扫码 获取用户人的微信信息?
扫描登录的二维码之后微信接口返回code(临时票据),拿着code值去请求微信的固定地址,返回得到两个值一个是aaccess_token(访问凭证),另一个是openid(微信的唯一标识),拿着这两个值再去请求微信的固定地址,得到微信扫描人的信息(其中包括用户的名称、头像等等)。