如今第三方登陸已經很廣泛了,隨便哪一個App都會有使用微信登陸,使用手機號碼登陸,或者使用支付寶登陸等功能...java
下面咱們就以使用微信登陸,作一個簡單的流程分析分析mysql
在上面的Oauth2的認證流程中,咱們就能夠看出一些貓膩來:git
在咱們拿着令牌去用戶信息系統調用用戶的相關信息的時候,web
用戶信息系統其實去請求了受權服務器,驗證l了該令牌的合法性算法
這樣每次認證都須要去調用受權服務器作一個令牌合法性驗證,顯得效率低下。spring
以前返回的令牌就是一個普通的令牌,使用了JWT以後,這個令牌似乎變得有點意思了起來sql
用戶在受權服務器經過以後,會獲得一個JWT令牌;apache
這個令牌中就已經包含了用戶相關的信息;json
客戶端只須要攜帶該JWT令牌訪問資源服務器便可;api
資源服務器會按照約定的算法自動完成令牌的校驗,這就就不用再去請求受權服務器了
流程我相信你們都已經看懂了,下面咱們就來一點文的,解釋一下JWT
Json Web Token:JWT一共包含了三部分數據,這三部分數據經過.分割拼接而成的字符串,如:xxx.yyy.zzz
1.Header:頭部【JSON】,一般頭部有兩部份信息,咱們可對頭部信息進行base64加密解密獲得頭部信息
聲明類型,這是一個JWT
聲明加密算法:自定義(HMAC / RSA /...)
以下所示模樣,
{
"typ": "JWT",
"alg": "HS256"
}2.payload【JSON】:載荷,就是咱們要寄存的數據,通常包含一下信息
用戶身份信息(採用bases加密,可解密,不建議存放過於敏感的信息)
註冊聲明:如該token的簽發時間,過時時間(exp),簽發人(iss)等信息
以下所示模樣:
{
"name": "456",
"admin": true
}3.Signature:簽名,是整個數據的認證信息,
通常根據前兩部的數據再加上服務器上的密鑰經過加密算法生成,用於驗證整個數據的完整性和可靠性
以下所示模樣:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)base64UrlEncode(header) :令牌的頭部分
base64UrlEncode(payload):令牌的載荷
secret :簽名所使用的密鑰
看到這裏,腦子裏一現,是否是能夠實現單點登陸哦?就用載荷保存用戶的惟一id,其餘服務豈不是就能夠得到用戶信息?
這裏或許你就會有疑問了?爲何上面咱們說了Oauth2,這裏卻不小試牛刀呢?
由於 Oauth2通常運用與分佈式項目中,須要單獨起一個服務作鑑權服務,而我並無想去搭建一套SpringCloud的想法
因此這裏就藉着網上的一點小資料,代碼也是模仿的別人的,我對它進行吸取並作下學習筆記順便分享出來
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ninja.study</groupId>
<artifactId>security_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Ninja-Security</name>
<description>鞋破露腳尖兒</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.7</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
更正一下,mysql的驅動類後面更換爲了:com.mysql.cj.jdbc.Driver 望周知!
很差理解的地方作了特別詳細的說明,你們學習可自行下載便可:
自測結果先說明一下:
註冊用戶
用戶登陸:
用戶帶着token去訪問服務
而後就是項目源碼說明:TODO 觀看大致上的說明便可,比較難理解的我都是一行一行給了備註的