SpringCloud商城day09 用户认证 -2021-10-17

一. 用户认证分析: 登录

1. 单点登录: 一处登录, 处处登录SSO(single sign on)

(1) 流程: 用户请求 -> 微服务网关 -> 用户/订单/秒杀微服务 -> 访问认证系统 -> 查询/存储在Redis
(2) 用户认证的框架:
    Apache Shiro
    CAS
    Spring security

2. 第三方登录: 用户第三方已有账号密码 -> 完成本系统的注册登录

(1) 第三方认证通用标准: OAUTH协议 -> OAUTH2.0
(2) 实现: 客户端访问网站 -> 客户点击微信登录 -> 网站向微信发起请求->微信返回授权给客户端 -> 客户同意授权 -> 网站向微信发送请求 -> 微信返回授权码给网站 -> 网站携带授权码向微信申请令牌 ->微信检测授权码发送令牌 -> 网站利用令牌请求微信用户信息 -> 微信检测令牌合法性响应用户信息 -> 网站显示用户信息
(3) resource owner用第三方登录 -> client请求 -> authorization server
 -> as返回授权页给ro -> ro授权 -> client再请求 -> as返回authorization grant
 -> client携带授权码请求token -> as返回token
 -> client携带token请求resource server -> rs想用resource
 -> client显示用户信息

(4)Oauth2应用:
    1) 本系统 -> 访问第三方资源
    2) 外部系统 -> 访问本系统
    3) 前端 -> 后端
    4) 微服务A -> 微服务B
        

二. 认证解决方案

(1) 流程: springsecurity+Oauth+JWT+Redis
    用户登录 -> 访问网关 -> 用户认证微服务 -> 合法则返回JWT -> 存储JWT到cookie和redis
  ->用户请求服务 -> 访问网关 -> 网关认证JWT(redis/cookie) -> 网关携带令牌跳转微服务 -> 微服务    
    校验令牌

三. JWT令牌

1. 优点: JSON, 令牌自定义扩展, 非对称加密+数字签名, 微服务不需要认证服务授权

2. 缺点: 令牌长, 存储大

3. 组成: 头部(typ)alg+负载(自定义扩展)+签名(base62Header.base64paylaod, secret)

4. 私钥(secret)+公钥生成:

(1) 生成密钥证书changgou.jks: keytool -genkeypair -alias changgou -keyalg RSA -keypass changgou -keystore changgou.jks -storepass changgou
    Keytool 是一个java提供的证书管理工具
    -alias:密钥的别名 
    -keyalg:使用的hash算法 
    -keypass:密钥的访问密码 
    -keystore:密钥库文件名,changgou.jks保存了生成的证书 
    -storepass:密钥库的访问密码
(2) 查询证书: keytool -list -keystore changgou.jks
(3) 加密工具包OpenSSL导出加密工具包
    -配置环境变量
    -keytool -list -rfc --keystore changgou.jks | openssl x509 -inform pem -pubkey
    -复制公钥-----BEGIN PUBLIC KEY-----
    -public.key 

四. Oauth2入门

1. 认证服务: changgou_user_oauth

(1)com.changgou.oauth.config组成:
    -认证服务器配置类ServerConfig: 数据源/令牌转换器/security接口/认证管理器/令牌持久化接口
    -令牌信息转换类AuthenticationConverter:
    -UserDetailService接口: 
    -WebSecurityConfig类: 安全认证配置
(2) yml配置类: 自定义属性
  auth:
  ttl: 3600  #token存储到redis的过期时间
  clientId: changgou
  clientSecret: changgou
  cookieDomain: localhost
  cookieMaxAge: -1
(3) 基于私钥 -> 生成jwt:
    秘钥库位置-> 秘钥库密码-> 秘钥工厂-> 获取私钥(别名,密码)-> 转换RSA私钥-> 作为jwt签名-> jwt对象
    Jwt jwt = JwtHelper.encode(JSON.toJSONString(map), new RsaSigner(rsaPrivateKey));
    String jwtEncoded = jwt.getEncoded();
(4) 基于公钥 -> 解析jwt:
    Jwt token &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值