登录、单点登录、微信扫描登录等

1,602 阅读6分钟

登录会话机制

http是无状态协议,浏览器的每次请求都是相互独立。但并不是每次http请求都与状态无关,为此,浏览器和服务器需要共同维护一个状态,这就是会话机制。

sessionID

  1. 实现原理 浏览器第一次向服务器发起请求,服务器会向浏览器返回sessionID,后续浏览器的每次请求都会带上sessionID已验证同一用户。
  • 服务器用session存储用户信息,浏览器通过sessionID获取对应session中的数据;
  • session一般存储在服务器的内存中,或者以文件的方式存储在服务器中(一个应用对应一个文件)。
  1. 缺点

token

还有一种方式是:服务器通过发放token,用于用户认证、App授权。

  • token是服务器生成的一串字符串,以作客户端进行请求的令牌,当第一次登陆后,服务器生成一个token便将此token返回给客户端,以后客户端只要带上这个token前来请求数据即可,无需再次带上用户名和密码。

JWT (JSON Web Token)

单点登录 SSO(SingleSign)

参考链接:

www.cnblogs.com/lyzg/p/6067… zhuanlan.zhihu.com/p/354205290

什么是sso

一次登录后可免登录访问其它的可信平台

CAS 中央认证服务

  • 一种独立开放指令协议
  • CAS是Yale大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法。

JWT

如何实现SSO

共享cookie

  • 基于cookie-session机制的系统中,登录系统会会返回一个sessionId存储在cookie中,如果我们能够让另外一个系统也能获取到这个cookie,就获取到凭证信息了,无需再次登录。
  • cookie允许同域名(或者父子域名)的不同端口中共享cookie,这点和http的同源策略不一样(http请求只要协议、域名、端口不完全相同便认为跨域)。因此只需要将多个应用前台页面部署到相同的域名(或者父子域名),然后共享session便可以实现单点登录。
  • 后端有多台服务器,可以通过使用同一redis或者同一数据库实现session共享。

基于回调实现

  • 基于JWT的token方式实现,JWT可以携带无法篡改的信息(一但篡改就会校验失败),所以我们可以将用户id等非敏感信息直接放到JWT中,干掉了后台的session。然后再将JWT共享给各个平台页面。

第三方登录、授权登录

流程简述

  1. 网站A先到QQ备案,说明自己的身份,然后会拿到两个身份识别码:客户端ID(AppID)和客户端密匙(AppSecret),同时网站A还需提供一个回调url。
  2. 用户进入网站A,选择QQ联合登录,会进入QQ指定的登录页面。
  3. 用户成功登录QQ并容易授权后QQ调用网站A提供的回调函数,传回一个code;
  4. 网站A通过AppID、AppSecret及code,调用指定的QQ接口,获取到access_token。
  5. 网站A将access_token存储起来
  6. 网站A通过access_token,调用指定的QQ接口,获取用户存储在QQ那里的个人信息。

OAuth 2.0

OAuth 2.0是目前最流行的授权机制,用来授权第三方应用,获取用户数据。

微信扫描登录

官方文档:

https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

二维码

存储数据,草料二维码,从微信可下载

流程简述

  • 微信服务器
  • A服务器
  • 当前用户个人信息存储在微信服务器端
  • 当前用户使用微信里面存储的信息登录A网站
  • A网站需要先去微信(微信开发平台)申请资格,获取账号、密码
  1. 生成二维码
  • “微信登录访问地址”生成二维码,后面带上回调方法
  1. 用户手机微信扫描二维码
  2. 微信弹出“确认登录”按钮
  3. 用户确认登录
  4. 微信服务器回调A网站提供的回调方法,并带上参数code
  5. 回调方法执行,获取参数code
  6. 通过账户和密码获取接口调用凭证
  7. 调用微信获取用户个人信息接口
  8. A网站获取到用户信息,则放行,及判定登录成功
  9. A网站有轮询请求用户是否扫描登录成功

流程图文详述

前提:网站A在微信有登录,有APPId、AppSecret和回调url

  1. 点击【网站A】登录界面上的微信登录

  2. 页面跳转至微信扫码页面

  • 具体url如下

https://open.weixin.qq.com/connect/qrconnect?appid=XXX&redirect_uri=http://XXX/oauth/callback/type/wechat/cooklogin/1&response_type=code&scope=snsapi_login

  1. 该页面向服务器发送获取二维码的请求

https://open.weixin.qq.com/connect/qrcode/041kg8dJ2jkEkl2l

  1. 服务器收到请求后,随机生成一个uuid,将这个id作为key值存入redis服务器,同时设置一个过期时间,在过期后,用户登录二维码需要进行刷新重新获取。

  2. 服务器就uuid和微信的验证字符串合在一起,生成一个二维码图片,然后将二维码图片和uuid一起返回给用户浏览器。 上叙二维码解码后的字符串是(https://open.weixin.qq.com/connect/confirm?uuid=021CHx9b2J0w0w3L

  3. 浏览器拿到二维码和uuid后,会每隔一秒向浏览器发送一次,登录是否成功的请求。请求中携带有uuid作为当前页面的标识符。 https://lp.open.weixin.qq.com/connect/l/qrconnect?uuid=041kg8dJ2jkEkl2l&_=1619598643447

  4. 浏览器拿到二维码后,将二维码展示到网页上

  5. 用户拿出手机微信扫描二维码,就可以得到一个二维码对应的信息。由于手机端已经进行过登录,在访问手机端的服务器的时候,参数中会携带用户的token。顾手机端将解析到的数据和用户token一起作为参数,向服务器发送验证登录请求。

  6. 手机端服务器收到请求后,首先对比参数中的验证消息,确认是否为用户登录请求接口。如果是,返回一个确认消息给手机端。

  7. 手机端收到返回后,将登录确认框显示给用户(防止用户误操作,同时使登录更加人性化)。

  8. 用户确认是进行的登录操作后,手机端再次发起请求。服务器拿到uuid和token,从token中解析到userId,然后将用户的userId作为value值存入redis中以uuid作为key的键值对中。

  9. 浏览器再次发生请求的时候,浏览器端的服务器可以得到一个用户的userId,将userId加密得到token,返回给浏览器,登录成功。

  10. 微信登录成功后,调用网站A提供的回调函数,传给网站A的一个code

  11. 网站A通过前提里面的AppId、AppSecret及code请求指定的接口获取到access_token、openid等信息

  12. 网站A通过access_token请求指定的接口获取用户信息