门户课程搜索环境搭建

1.用互联网无法访问微服务的局域网
所以通过http协议访问本地目录下的资源,用nginx虚拟主机
image.png
image.png

步骤:
修改nginx配置文件
重新加载nginx
通过浏览器访问本地页面

2.测试(4个功能)
image.png

用户登录环境配置和搭建

UAA统一认证要求:
—不同用户种类的认证:学员,教师,运营
—分布式系统的要求:统一认证可以独立运行独立部署
—不同种类的登录:账号密码,手机号密码……

一、UAA服务

1.UAA是啥?
公司一般命名统一认证系统为UAA(User Account and Authentication ):认证鉴权系统
2.UAA用户数据特点
用户数据的分离:认证服务(存放客户端数据,商户数据),用户中心(存储资源拥有者数据,用户数据)
只存用户账号数据,对于业务数据需要各个系统自己存储
密码会用MD5加盐加密
image.png
3.MD5加密特点
—加密后内容不可逆
—同一个内容加密多次得到结果一致
image.png
—加密后的字符长度是一致的(不管加密的内容长度是多少,加密后长度唯一:32位)
image.png
image.png
那md5可以被破解码?
可以,利用第二个特点,同一个内容多次加密结果一致,(彩虹碰撞),将需要加密的内容设置为key,将密文设置为value,然后一次次进行匹配
为了防止彩虹碰撞:
给密码加盐(加一些其他字符,然后在进行加密,就算碰撞成功,得出的也不是真正的密码)
4.认证:登录
5.授权:赋予权限

6.认证分为两种:
—基于session
image.png
数据存储特点:存在服务器
缺点:对服务器压力大
优点:安全性较高
—基于Token(我们用介个)
image.png
数据存储特点:存到客户端,JWT令牌
缺点:安全性不高,令牌暴露
优点:服务器压力变小

7.OAuth2.0认证
(基于token认证实现的认证协议)
image.png

OAuth2.0授权码模式

用户 黑马程序员页面 微信认证 微信用户资源
流程:用户登录—-》黑马程序员页面返回登录界面———-》用户点击微信认证(请求认证)———-》微信认证校验商户的clientid———-》返回用户登录界面—————》用户输入用户账号和密码———-》微信认证校验密码返回用户授权页面—————》用户。。。。自己去看时序图,没跟上!

用户:资源拥有者
黑马:客户端
微信认证:认证服务器
微信用户资源:资源服务

1.UAA体系结构

image.png
1.我们以后用UAA的网关服务
2.此图中:OAuth2.0四个角色
客户端————学成在线
资源拥有着——-用户
认证服务————UAA认证服务
资源服务————学成业务服务
3.UAA集成
环境搭建——————数据库导入————-服务导入———————————-ing————————————自己准备
4.流程
流程:

  • 用户通过前端登录学成在线,采取OAuth2.0 密码模式请求认证服务(UAA)
  • UAA调用认证服务查询该用户是否有对应权限
  • UAA通过用户中心获取账号密码进行验证
  • 验证全通过后生成令牌返回前端,包含了用户权限及接入方权限
  • 后续用户访问微服务都需要携带该令牌,网关会对令牌进行解析校验,校验通过后可以访问

    2.OAuth2主要模式

    (加粗的为常用)

  • 授权码模式:适用于第三方服务或app登录

  • 隐式授权模式:适用于第三方单页面应用
  • 密码模式:适用于第一方服务或app登录
  • 客户端模式:没有用户参与,完全信任服务

我们用密码模式为啥?
我们用的都是自己开发的,为了简化,就用密码模式
我们使用Spring Security Oauth2框架来实现

3.认证测试

申请令牌

1.测试路径,请求参数等等
image.png
2.登录后,获得访问令牌
3.令牌有效时间;7200秒(2个小时)
image.png

令牌解析:
1.路径
image.png

刷新令牌(3天)
1.路径image.png

小结:申请和刷新令牌由框架提供

image.png

4.UAA数据特点

UAA认证服务分为两部分
—认证服务:存放的是客户端的数据(商户数据)
—用户中心:存储资源拥有者数据(用户数据)

5.JWT令牌

1.什么是JWT令牌:
开放的行业标准,用于通信双方传递json对象,传递的信息经过数字签名可以被验证和信任,使用HMAC算法或使用RSA的公钥/私钥来签名,防止被篡改
2.优点
—基于json,方便解析
—可以再令牌中自定义丰富的内容,以扩展
—通过非对称加密算法及数字签名技术,防止篡改,安全性能高

3.结构 每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz

  • JWT令牌由Header、Payload、Signature三部分组成,每部分中间使用点(.)分隔
  • Header、Payload采用Base64编码,Signature采用非对称加密

—Header
头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)。使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。
—Payload
第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比
如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。
此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。
第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。
—Signature
第三部分是签名,此部分用于防止jwt内容被篡改。
这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明
签名算法进行签名。
eg:
base64UrlEncode(header):jwt令牌的第一部分。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:签名所使用的密钥。

6.JWT加密方式

加密算法可以分为三类:
—对称加密,如AES(加密解密都采用一个秘钥
基本原理:将明文分成N个组,然后使用密钥对各个组进行加密,形成各自的密文,最后把所有的分组密文进行合并,形成最终的密文。
优势:算法公开、计算量小、加密速度快、加密效率高
缺陷:双方都使用同样密钥,安全性得不到保证
—非对称加密,如RSA(有两把秘钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端
基本原理:同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端
私钥加密,持有私钥或公钥才可以解密
公钥加密,持有私钥才可解密
优点:安全,难以破解
缺点:算法比较耗时
—不可逆加密,如MD5,SHA(加密的内容不可逆,无法根据密文推算出明文
基本原理:加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,无法根据密文推算出明文。

7.JWT 的编码

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。
在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
image.png
eg: 文本——-ASCII———二进制———-索引———-Base64编码
image.png

二、认证服务环境构建

image.png
结构:

  • 客户端:通过前端访问后端获取令牌并存储在Cookies中,以后访问都需要携带令牌
  • 前端:
    • 学成门户对应普通用户
    • 后台管理工程对应平台运营
    • 前台管理工程对应教育机构
  • 认证服务:
    • 认证服务
    • 用户中心
  • 后端:通过网关校验用户令牌成功后放行

1.为甚必须要同域访问?
前后端同一个域名下,前端后端才可以拿到存储用户的访问令牌:Cookie
2.访问不同的网站Cookie不一样

3.浏览器如何实现访问不同网站携带不同Cookie?
每个Cookie所属于一个域

4.门户和网关已经设置在同一域下了,
要是登录必须开启前台管理工程
后台管理工程和前台管理工程里面存在测试令牌,现在带令牌访问网关是无权访问的,现在用的是UAA,所以会报错,所以要将此令牌干掉

第一件大事:前端环境搭建

设置前端工程在同一域下,干掉后台管理工程和前台管理工程里面存在的测试令牌
1.同域设置
image.png
image.png
2.删除测试令牌
教学机构:(前台管理)
—打开此文件
image.png
—将令牌注释image.png
—修改域名
image.png
运营平台:(后台管理)
—修改网关
image.png

—修改域名
image.png
—注释令牌
image.png
—修改域名
image.png

第二件大事:(后端)

搭建教学管理微服务,所有包含机构id的服务,要交给SpringSecurity管理其他服务需要发送fegin接口调用此服务
1.搭建教学机构环境 讲义2.3.1.1

2.启动教学机构服务(注册到nacos中即可)

现在项目存在问题:

登录后————-打开课程查询页面发现并没有数据————-通过代码发现取到的公司id=null
原因:
—Security没有交给Spring管理
—没有发送fegin接口进行服务调用
image.png
解决:
image.png

什么样的微服务需要添加?
需要被SpringSecurity管理,需要获得公司id
image.png