<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot + Spring Security OAuth2基本使用

          共 3929字,需瀏覽 8分鐘

           ·

          2021-06-19 20:36

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          OAuth2.0基本知識(shí)

          網(wǎng)上關(guān)于OAuth2.0的介紹已經(jīng)很多了,這里就不做過(guò)多的介紹,不太了解的朋友可以參考理解OAuth 2.0

          Spring Security OAuth2

          基本配置

          這里依然使用maven來(lái)做管理

          <dependency>
              <groupId>org.springframework.security.oauth</groupId>
              <artifactId>spring-security-oauth2</artifactId>
          </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>

          認(rèn)證服務(wù)器

          Authorization Server

          在過(guò)OAuth2.0有了基本概念后,我們會(huì)知道其中有一個(gè)服務(wù)提供商,我們就先來(lái)完成它。 
          這里只需要新建一個(gè)類(lèi),并添加相應(yīng)的注釋就可以了

          @Configuration
          @EnableAuthorizationServer
          public class MyAuthorizationServerConfig {
          }

          隨后我們啟動(dòng)項(xiàng)目,就會(huì)發(fā)現(xiàn)控制臺(tái)有如下的語(yǔ)句打?。?/span>

          這就表明Authorization Server已經(jīng)建立起來(lái)了。我們可根據(jù)OAuth的規(guī)則來(lái)訪問(wèn)相應(yīng)的接口。

          第三方應(yīng)用 User authenticates

          在有了服務(wù)提供商之后,我們就可以根據(jù)OAuth的規(guī)則,來(lái)要求用戶給予授權(quán)。這里我們以code模式為例。 
          所以這里需要第三方應(yīng)用去調(diào)用接口

          http://localhost:8080/oauth/authorize?response_type=code&client_id=3aa1f466-c67d-4f72-a8a8-62ed94d7d638&redirect_uri=http://www.baidu.com&scope=all

          這里對(duì)接口參數(shù)做一個(gè)簡(jiǎn)單的介紹。

          • localhost:8080這里是我服務(wù)的地址以及端口,根據(jù)每個(gè)人的情況是不同的

          • /oauth/authorize這個(gè)是Spring Security OAuth2默認(rèn)提供的接口

          • response_type:表示授權(quán)類(lèi)型,必選項(xiàng),此處的值固定為”code”

          • client_id:表示客戶端的ID,必選項(xiàng)。這里使用的是項(xiàng)目啟動(dòng)時(shí),控制臺(tái)輸出的security.oauth2.client.clientId,當(dāng)然該值可以在配置文件中自定義

          • redirect_uri:表示重定向URI,可選項(xiàng)。即用戶授權(quán)成功后,會(huì)跳轉(zhuǎn)的地方,通常是第三方應(yīng)用自己的地址

          • scope:表示申請(qǐng)的權(quán)限范圍,可選項(xiàng)。這一項(xiàng)用于服務(wù)提供商區(qū)分提供哪些服務(wù)數(shù)據(jù)

          • state:表示客戶端的當(dāng)前狀態(tài),可以指定任意值,認(rèn)證服務(wù)器會(huì)原封不動(dòng)地返回這個(gè)值。這里沒(méi)有使用到該值

          這里我們?cè)L問(wèn)到接口后,會(huì)出現(xiàn)如下的界面 

          該界面主要是用于用戶登錄的,不然怎么知道想要哪個(gè)用戶的數(shù)據(jù)呢?

          在登錄成功后,來(lái)到如下界面 
           
          這里就是要求用戶授權(quán)的界面了,有點(diǎn)類(lèi)似于我們使用QQ進(jìn)行第三方登錄時(shí)候的界面。上面寫(xiě)有了是哪一個(gè)第三方應(yīng)用需要哪些數(shù)據(jù)。

          我們這里就點(diǎn)確認(rèn)授權(quán),這里就會(huì)根據(jù)配置的redirect_uri進(jìn)行跳轉(zhuǎn),并且是帶有一個(gè)參數(shù)的。 
          這里我們跳轉(zhuǎn)到了:https://www.baidu.com/?code=XKxYIx。

          這個(gè)code就是下一步第三方應(yīng)用向服務(wù)器申請(qǐng)令牌使用的

          請(qǐng)求Token

          這里我們拿著上一步獲取到的code,以及項(xiàng)目初始化時(shí)打印的clientId和secret去獲取Token。 
          這里需要使用POST方法,

          POST /oauth/token HTTP/1.1 
          Host: localhost:8082 
          Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
          Content-Type: application/x-www-form-urlencoded

          grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
          &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

          請(qǐng)求的Header中有一個(gè)Authorization參數(shù),該參數(shù)的值是Basic + (clientId:secret Base64值)

          • grant_type:表示使用的授權(quán)模式,必選項(xiàng),此處的值固定為”authorization_code”。

          • code:表示上一步獲得的授權(quán)碼,必選項(xiàng)。

          • redirect_uri:表示重定向URI,必選項(xiàng),且必須與A步驟中的該參數(shù)值保持一致。

          • client_id:表示客戶端ID,必選項(xiàng)。

          如果請(qǐng)求成功,就可以順利的拿到Token

          獲取到Token

          請(qǐng)求Token成功后,認(rèn)證服務(wù)器發(fā)送的HTTP回復(fù)

          HTTP/1.1 200 OK 
          Content-Type: application/json;charset=UTF-8 
          Cache-Control: no-store 
          Pragma: no-cache

           {
             "access_token":"2YotnFZFEjr1zCsicMWpAA",
             "token_type":"example",
             "expires_in":3600,
             "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
             "example_parameter":"example_value"
           }

          • access_token:表示訪問(wèn)令牌,必選項(xiàng)。

          • token_type:表示令牌類(lèi)型,該值大小寫(xiě)不敏感,必選項(xiàng),可以是bearer類(lèi)型或mac類(lèi)型。

          • expires_in:表示過(guò)期時(shí)間,單位為秒。如果省略該參數(shù),必須其他方式設(shè)置過(guò)期時(shí)間。

          • refresh_token:表示更新令牌,用來(lái)獲取下一次的訪問(wèn)令牌,可選項(xiàng)。

          • scope:表示權(quán)限范圍,如果與客戶端申請(qǐng)的范圍一致,此項(xiàng)可省略。

          資源服務(wù)器

          和認(rèn)證服務(wù)器一樣,這里實(shí)現(xiàn)資源服務(wù)器就很容易了

          @Configuration
          @EnableResourceServer
          public class MyResourceServerConfig {
          }

          這樣我們就可以用Token來(lái)訪問(wèn)接口了。 
          例如:

          GET /user HTTP/1.1 
          Host: localhost:8082 
          Authorization: bearer 9b2aaea4-d161-4636-8883-6756a372e735

          這里Authorization中,bearer 是上一步返回的token_type。

          遺留問(wèn)題

          目前基本功能是實(shí)現(xiàn)了,但是還有兩個(gè)遺留問(wèn)題需要解決: 
          1. 現(xiàn)在的Token是存在Session中的,服務(wù)器重啟后原來(lái)客戶端的Token就失效了。 
          2. Token現(xiàn)在是自動(dòng)生成的,是否可以用JWT來(lái)自定義生成呢?



          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/u013435893/article/details/79735097








          瀏覽 60
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲高清有码无码视频 | 在线能看的丝袜网站 | 稀缺小u女呦品呦cB视频 | 台湾午夜无码 | 亚洲高清无码视频下载 |