一. 用户认证分析: 登录
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 &