# :-: 服務認證授權架構設計
:-: Spring Cloud Security Oauth2.0 jwt
* 什么是認證中心
身份認證,就是判斷一個用戶是否為合法用戶的處理過程。最常用的簡單身份認證方式是系統通過核對用戶輸入的用戶名和口令,看其是否與系統中存儲的該用戶的用戶名和口令一致,來判斷用戶身份是否正確。
* 為什么要使用認證中心
登錄請求后臺接口,為了安全認證,所有請求都攜帶`token`信息進行安全認證,比如使用`vue`、`react`后者`h5`開發的`app`,用于控制可訪問系統的資源。
:-:
:-:
Spring 提供的 Spring Security oAuth2 能搭建一套驗證授權及資源訪問服務,幫助大家在實現企業微服務架構時能夠有效的控制多個服務的統一登錄、授權及資源保護工作。
### 什么是OAuth2?
OAuth2是一個關于授權的開放標準,核心思路是通過各類認證手段(具體什么手段OAuth2不關心)認證用戶身份,并頒發token(令牌),使得第三方應用可以使用該令牌在**限定時間**、**限定范圍**訪問指定資源。獲取令牌的方式主要有四種,分別是`授權碼模式`,`簡單模式`,`密碼模式`和`客戶端模式`
這里要先明確幾個OAuth2中的幾個重要概念:
* `resource owner`: 擁有被訪問資源的用戶
* `user-agent`: 一般來說就是瀏覽器
* `client`: 第三方應用
* `Authorization server`: 認證服務器,用來進行用戶認證并頒發token
* `Resource server`:資源服務器,擁有被訪問資源的服務器,需要通過token來確定是否有權限訪問
### 什么是Spring Security?
Spring Security是一套安全框架,可以基于RBAC(基于角色的權限控制)對用戶的訪問權限進行控制,核心思想是通過一系列的filter chain來進行攔截過濾。
### 認證與授權(Authentication and Authorization)
一般意義來說的應用訪問安全性,都是圍繞認證(Authentication)和授權(Authorization)這兩個核心概念來展開的。即首先需要確定用戶身份,在確定這個用戶是否有訪問指定資源的權限。認證這塊的解決方案很多,主流的有`CAS`、`SAML2`、`OAUTH2`等,我們常說的單點登錄方案(SSO)說的就是這塊,授權的話主流的就是spring security和shiro。
### JWT介紹
JWT全稱為Json Web Token 由三部分組成 。第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似于飛機上承載的物品),第三部分是簽證(signature)。如下eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
### header
jwt的頭部承載兩部分信息:
* 聲明類型,這里是jwt
* 聲明加密的算法 通常直接使用 HMAC SHA256
完整的頭部就像下面這樣的JSON:
~~~bash
{
'typ': 'JWT',
'alg': 'HS256'
}
~~~
### playload
載荷就是存放有效信息的地方。這個名字像是特指飛機上承載的貨品,這些有效信息包含三個部分
* 標準中注冊的聲明
* 公共的聲明
* 私有的聲明
**標準中注冊的聲明** (建議但不強制使用) :
* **iss**: jwt簽發者
* **sub**: jwt所面向的用戶
* **aud**: 接收jwt的一方
* **exp**: jwt的過期時間,這個過期時間必須要大于簽發時間
* **nbf**: 定義在什么時間之前,該jwt都是不可用的.
* **iat**: jwt的簽發時間
* **jti**: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。
### signature
jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成:
* header (base64后的)
* payload (base64后的)
* secret
這個部分需要base64加密后的header和base64加密后的payload使用`.`連接組成的字符串,然后通過header中聲明的加密方式進行加鹽`secret`組合加密,然后就構成了jwt的第三部分
- 項目介紹
- 項目聲明
- 項目簡介
- 架構設計
- 項目亮點功能介紹
- 技術棧介紹
- 核心功能
- 運行環境
- 項目更新日志
- 文檔更新日志
- F&Q
- 部署教程
- 環境準備
- JDK安裝
- JDK1.8,17共存
- maven
- 分布式緩存Redis
- 單機版
- 集群
- 注冊&配置中心alibaba/nacos
- 介紹
- Nacos安裝
- Nacos配置中心
- Nacos注冊發現
- Nacos生產部署方案
- 服務監控-BootAdmin
- 基本介紹
- 如何使用
- 整合Admin-Ui
- 客戶端配置
- 鏈路追蹤
- 基本介紹
- SkyWalking-1
- Skywalking-1
- 消息隊列
- Kafka
- docker安裝kafka
- Linux集群
- Maven私服
- nexus安裝部署
- nexus使用介紹
- 全文搜索elasticsearch
- windows集群搭建
- docker安裝es
- ElasticHD
- linux集群部署
- 統一日志解決方案
- 日志解決方案設計
- 介紹與相關資料
- ELK安裝部署
- elasticsearch 7.5
- logstash-7.5
- kibana-7.5
- filebeat
- 服務監控-Prometheus
- Prometheus安裝配置
- Prometheus介紹
- grafana
- 持續集成部署CICD
- 自動化部署Jenkins
- 安裝部署win
- 打包發布遠程執行
- 安裝部署linux
- jenkins+gitlab+docker容器化工程自動化部署
- Git
- CICD說明
- 阿里云效
- CentOS_MYSQL安裝
- docker
- 安裝
- Docker安裝Nginx
- Docker部署啟動springboot
- dockerCompose
- harbor
- Docker私有鏡像倉庫
- Portainer
- Docker遠程連接設置
- 打包工程
- 必要啟動模塊
- 核心模塊
- 登錄認證
- 緩存功能
- 日志模塊
- 分布式鎖
- 消息隊列
- 異常處理
- 系統接口
- 參數驗證
- es檢索
- 數據導出
- 系統設計
- 系統總體架構
- 擴展模塊(可選)
- 限流熔斷alibaba/sentinel
- 使用Sentinel實現gateway網關及服務接口限流
- Sentinel使用Nacos存儲規則及同步
- 服務調用Feign
- Feign基本介紹
- 如何使用
- 負載均衡
- 請求超時
- 請求攔截器
- 分布式任務調度
- XXL-JOB
- 分布式事務
- TX-LCN
- Seata
- Seata原理解析
- 數據庫分庫分表
- swagger文檔
- 分布式ID生成器解決方案
- 服務網關CloudGateway
- 基本介紹
- 使用網關
- 路由配置
- 全局過濾器
- 服務認證授權架構設計
- 認證服務流程
- 授權服務流程
- 系統冪等性設計與實踐
- 分布式日志鏈路跟蹤
- 實時搜索系統設計
- 應用性能
- 壓力測試工具
- Apache JMeter介紹和安裝
- ApacheJMeter使用
- JVM
- JVM性能調優
- 常見JVM內存錯誤及解決方案
- JVM 分析工具詳解
- Spring Cloud性能調優
- Linux運維
- Linux 常用命令
- Linux開啟端口