国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄

這篇具有很好參考價(jià)值的文章主要介紹了【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

(Github授權(quán)登錄的具體操作在目錄第三“章”)

一、OAuth2 簡(jiǎn)單概述

下面是《深入淺出Spring Security》書(shū)中的一段概述:

OAuth 是一個(gè)開(kāi)放標(biāo)準(zhǔn)(現(xiàn)在所說(shuō)的 OAuth 一般都是指 OAuth2,即 2.0 版本),可以理解為是一種協(xié)議,該標(biāo)準(zhǔn)允許用戶讓第三方應(yīng)用訪問(wèn)該用戶在某一網(wǎng)站上存儲(chǔ)的私密資源(如頭像、照片、視頻等),并且在這個(gè)過(guò)程中無(wú)須將用戶名和密碼提供給第三方應(yīng)用。通過(guò)令牌(token)可以實(shí)現(xiàn)這一功能,每一個(gè)令牌授權(quán)一個(gè)特定的網(wǎng)站在特定的時(shí)段內(nèi)允許訪問(wèn)特定的資源。

OAuth 讓用戶可以授權(quán)第三方網(wǎng)站靈活訪問(wèn)它們存儲(chǔ)在另外一些資源服務(wù)器上的特定信息,而非所有內(nèi)容。對(duì)于用戶而言,我們?cè)诨ヂ?lián)網(wǎng)應(yīng)用中最常見(jiàn)的 OAuth 應(yīng)用就是各種第三方登錄,例如:QQ授權(quán)登錄、微信授權(quán)登錄、下面要解釋的Github 授權(quán)登錄等等。

注意:這里所述的第三方應(yīng)用是相對(duì)而言的。例如用戶想通過(guò) QQ 登錄今日頭條,這時(shí)相對(duì)于QQ而言,今日頭條就是第三方應(yīng)用,對(duì)今日頭條而言,QQ就是第三方應(yīng)用。當(dāng)今日頭條通過(guò)QQ授權(quán)登錄時(shí),QQ 不會(huì)把 用戶名/密碼 給今日頭條,只會(huì)傳一種 token 令牌,允許它訪問(wèn) QQ用戶中的一些信息(一般是只讀信息)。

二、OAuth2 四種授權(quán)模式之授權(quán)碼模式

OAuth2 協(xié)議一共支持四種不同的授權(quán)模式:授權(quán)碼模式、簡(jiǎn)化模式、密碼模式、客戶端模式。下面解釋一下最安全、使用最廣泛的一種 OAuth2 權(quán)限模式——授權(quán)碼模式。以下是授權(quán)流程圖:

【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄

  1. 用戶點(diǎn)擊登錄鏈接(按鈕),系統(tǒng)會(huì)將用戶導(dǎo)入授權(quán)服務(wù)器的登錄頁(yè)面,對(duì)應(yīng)著A(用戶-》瀏覽器-》認(rèn)證服務(wù)器響應(yīng)給瀏覽器);
  2. 用戶選擇是否給予授權(quán),這一階段進(jìn)行的是用戶選擇認(rèn)證階段,對(duì)應(yīng)著B(niǎo)。
  3. 如果用戶同意授權(quán),則授權(quán)服務(wù)器會(huì)將頁(yè)面重定向到 redirect_uri 指定的地址,同時(shí)攜帶一個(gè)授權(quán)碼參數(shù),帶著授權(quán)碼去重定向,這個(gè)時(shí)候是向授權(quán)服務(wù)器請(qǐng)求令牌,在后端進(jìn)行,在Spring Security 中即對(duì)應(yīng)著認(rèn)證操作,對(duì)應(yīng)著步驟C。
  4. 授權(quán)服務(wù)器對(duì)參數(shù)進(jìn)行校驗(yàn)之后,即認(rèn)證成功后會(huì)返回 Access Token 和 Refresh Token,即Authentication,這個(gè)過(guò)程對(duì)應(yīng)著E。
  5. 通過(guò)了認(rèn)證就可以向資源服務(wù)器請(qǐng)求資源了。

授權(quán)碼模式被認(rèn)為是最安全的一種模式,是因?yàn)檫@種模式的 Access Token 不會(huì)經(jīng)過(guò)瀏覽器,是直接從項(xiàng)目的后端獲取,并從后端發(fā)送到資源服務(wù)器上,這樣就很大程度上減少了 Access Token 泄露的風(fēng)險(xiǎn)。

redirect_uri :該參數(shù)表示在登錄校驗(yàn)成功/失敗后(例如Github校驗(yàn)成功或失敗后),跳轉(zhuǎn)的地址,跳轉(zhuǎn)的時(shí)候,還會(huì)攜帶上一個(gè)授權(quán)碼參數(shù),開(kāi)發(fā)者再根據(jù)這個(gè)授權(quán)碼獲取 Access Token。Spring Security 中跳轉(zhuǎn)的地址應(yīng)該為 /login/oauth2/code/*, * 表示的是第三方授權(quán)應(yīng)用名,如需要github授權(quán)登錄,那它的 redirect_uri 應(yīng)該為 /login/oauth2/code/github。

三、Github 授權(quán)登錄

準(zhǔn)備工作

首先需要將第三方應(yīng)用的信息注冊(cè)到 Github 上。登錄自己的Github賬戶,點(diǎn)擊 Settings。

【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄
點(diǎn)擊 New OAuth app,添加新的應(yīng)用。
【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄需填寫(xiě)的信息概述:

  • application name:應(yīng)用名稱
  • Homepage URL:項(xiàng)目主頁(yè)面
  • Authorization callback URL:認(rèn)證成功后的回調(diào)頁(yè)面,默認(rèn)的回調(diào) URL 地址模版為 {baseUrl}/login/oauth2/code/{registrationId},其中 registration 是ClientRegistration 的唯一標(biāo)識(shí)符,則在接下來(lái)的 SpringBoot 項(xiàng)目中就不必提供回調(diào)接口了(但寫(xiě)上也無(wú)妨)。

以下是我測(cè)試的注冊(cè)內(nèi)容(然后點(diǎn)擊注冊(cè)):

【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄
注冊(cè)成功后會(huì)獲取到兩個(gè)參數(shù),Client IDClient Secret,保存這倆參數(shù),在配置項(xiàng)目中需要使用。

【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄

創(chuàng)建 Spring Boot 項(xiàng)目

  1. 需要的起步依賴
    【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄
  2. 配置 oauth-Client(application.yml):
spring:
  security:
    oauth2:
      client:
        registration:
          github:
            client-id: 57b238e8791efafaead6
            client-secret: 33b3e36f0e464a5c13426fe59e61230ef72a1a47
            redirect-uri: http://localhost:8080/login/oauth2/code/github
server:
  port: 8080
  servlet:
    context-path: /
  1. 創(chuàng)建測(cè)試接口(TestController)
@RestController
public class TestController {

    @GetMapping("/test")
    public DefaultOAuth2User test(){
        System.out.println("Test Result~~~~");
        return (DefaultOAuth2User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
    
}
  1. 創(chuàng)建 SpringSecurity 配置類(SecurityConfig)
@EnableWebSecurity
public class SecurityConfig {
    
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .oauth2Login()
                .failureHandler((req,res,e)->{
                    res.setContentType("text/html;charset=utf-8");
                    PrintWriter out = res.getWriter();
                    out.print("認(rèn)證失敗");
                })
                .and()
                .cors()
                .configurationSource(this.corsConfigurationSource())
                .and()
                .csrf((config)->{
                    config.disable();
                })
                .build();
    }

    private CorsConfigurationSource corsConfigurationSource(){
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedHeader("*"); // 這個(gè)得加上,一些復(fù)雜的請(qǐng)求方式會(huì)帶有header,不加上跨域會(huì)失效。
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addExposedHeader("*");
        corsConfiguration.addAllowedOriginPattern("http://localhost:5173");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);
        return source;
    }
    
}

Vue 測(cè)試代碼

這里再提一嘴,不然前端部分的超鏈接地址看不懂:

后端配置使用 OAuth2Login 授權(quán)登錄時(shí),Spring Security 中有倆過(guò)濾器會(huì)開(kāi)啟——OAuth2AuthorizationRequestRedirectFilter、OAuth2LoginAuthenticationFilter。例如:重定向到Github提供的授權(quán)頁(yè)面即是OAuth2AuthorizationRequestRedirectFilter過(guò)濾的;認(rèn)證請(qǐng)求,授權(quán)成功跳轉(zhuǎn)URL的即是OAuth2LoginAuthenticationFilter過(guò)濾的。
【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄

所以那授權(quán)登錄按鈕我寫(xiě)的地址是:http://localhost:8080/oauth2/authorization/github,OAuth2AuthorizationRequestRedirectFilter 會(huì)過(guò)濾掉它然后重定向到Github提供的授權(quán)頁(yè)面…

<script setup>
import { ref } from 'vue'
import axios from '../utils/index.js'

function test(){
    axios.get(`/test`,{
        withCredentials: true,   //設(shè)置跨域的時(shí)候傳遞cookie,需要服務(wù)端的配合
    }).then(res=>{
        console.log(res)
        content.value = res
    }).catch(err=>{
        console.log(666)
        console.log(err)
    })
}

</script>

<template>
    <div>
        <el-button type="info" round>
            <el-link href="http://localhost:8080/oauth2/authorization/github"> github </el-link>
        </el-button>
        <br><br>
        <button @click="test">發(fā)送測(cè)試請(qǐng)求</button><br><br>
    </div>
</template>

測(cè)試效果

這里不是實(shí)際的效果(實(shí)際效果應(yīng)該是:點(diǎn)擊"http://localhost:8080/oauth2/authorization/github"超鏈接后,會(huì)返回302,重定向到Github授權(quán)頁(yè)面,授權(quán)成功后又會(huì)重定向到配置的 redirect_uri(http://localhost:8080/login/oauth2/code/github?code=???&state=???),這個(gè)時(shí)候就是關(guān) OAuth2LoginAuthenticationFilter 的事了,這里會(huì)根據(jù) redirect_uri 中請(qǐng)求參數(shù)攜帶的授權(quán)碼 code,向Github授權(quán)服務(wù)器的https://github.com/login/oauth/access_token 接口去請(qǐng)求 Access Token,拿到AccessToken后,再向 https://api.github.com/user 地址發(fā)送請(qǐng)求,獲取用戶信息,前面是瀏覽器可見(jiàn)的,后面獲取令牌是在后端完成的,是用戶不可見(jiàn)的)。

【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄
下面是我遇到的一些疑問(wèn),問(wèn)的ChatGpt的,如果有同樣的疑慮可以看看:

【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄
測(cè)試中間會(huì)有跳轉(zhuǎn)Github授權(quán)登錄頁(yè)面(https://github.com/login/oauth/authorize?..),請(qǐng)求 Access Token 也會(huì)訪問(wèn)Github(https://github.com/login/oauth/access_token),比較慢,我不耐煩就瘋狂點(diǎn),就報(bào)下面錯(cuò)了(大家可別學(xué)我)。
【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-498601.html

到了這里,關(guān)于【深入淺出 Spring Security(十二)】使用第三方(Github)授權(quán)登錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【深入淺出Spring Security(五)】自定義過(guò)濾器進(jìn)行前后端登錄認(rèn)證

    【深入淺出Spring Security(五)】自定義過(guò)濾器進(jìn)行前后端登錄認(rèn)證

    在【深入淺出Spring Security(二)】Spring Security的實(shí)現(xiàn)原理 中小編闡述了默認(rèn)加載的過(guò)濾器,里面有些過(guò)濾器有時(shí)并不能滿足開(kāi)發(fā)中的實(shí)際需求,這個(gè)時(shí)候就需要我們自定義過(guò)濾器,然后填入或者替換掉原先存在的過(guò)濾器。 首先闡述一下添加過(guò)濾器的四個(gè)方法(都是 HttpSecur

    2024年02月08日
    瀏覽(24)
  • 【深入淺出 Spring Security(四)】登錄用戶數(shù)據(jù)的獲取,超詳細(xì)的源碼分析

    【深入淺出 Spring Security(四)】登錄用戶數(shù)據(jù)的獲取,超詳細(xì)的源碼分析

    在【深入淺出Spring Security(一)】Spring Security的整體架構(gòu) 中敘述過(guò)一個(gè)SecurityContextHolder 這個(gè)類。說(shuō)在處理請(qǐng)求時(shí),Spring Security 會(huì)先從 Session 中取出用戶登錄數(shù)據(jù),保存到 SecurityContextHolder 中,然后在請(qǐng)求處理完畢后,又會(huì)拿 SecurityContextHolder 中的數(shù)據(jù)保存到 Session 中,然后再

    2024年02月07日
    瀏覽(18)
  • 【深入淺出 Spring Security(十一)】授權(quán)原理分析和持久化URL權(quán)限管理

    【深入淺出 Spring Security(十一)】授權(quán)原理分析和持久化URL權(quán)限管理

    在 【深入淺出Spring Security(一)】Spring Security的整體架構(gòu) 中小編解釋過(guò)授權(quán)所用的三大組件,在此再解釋說(shuō)明一下(三大組件具體指:ConfigAttribute、AccessDecisionManager(決策管理器)、AccessDecisionVoter(決策投票器)) ConfigAttribute 在 Spring Security 中,用戶請(qǐng)求一個(gè)資源(通常是

    2024年02月10日
    瀏覽(25)
  • 深入淺出Java多線程(十二):線程池

    深入淺出Java多線程(十二):線程池

    大家好,我是你們的老伙計(jì)秀才!今天帶來(lái)的是[深入淺出Java多線程]系列的第十二篇內(nèi)容:線程池。大家覺(jué)得有用請(qǐng)點(diǎn)贊,喜歡請(qǐng)關(guān)注!秀才在此謝過(guò)大家了?。。?在現(xiàn)代軟件開(kāi)發(fā)中,多線程編程已經(jīng)成為應(yīng)對(duì)高并發(fā)、高性能場(chǎng)景的必備技術(shù)。隨著計(jì)算機(jī)硬件的發(fā)展,尤其是

    2024年03月13日
    瀏覽(55)
  • 深入淺出Spring AOP

    深入淺出Spring AOP

    第1章:引言 大家好,我是小黑,咱們今天要聊的是Java中Spring框架的AOP(面向切面編程)。對(duì)于程序員來(lái)說(shuō),理解AOP對(duì)于掌握Spring框架來(lái)說(shuō)是超級(jí)關(guān)鍵的。它像是魔法一樣,能讓咱們?cè)诓桓淖冊(cè)写a的情況下,給程序增加各種功能。 AOP不僅僅是一個(gè)編程范式,它更是一種思

    2024年01月20日
    瀏覽(28)
  • 深入淺出 Spring:核心概念和基本用法詳解

    深入淺出 Spring:核心概念和基本用法詳解

    個(gè)人主頁(yè):17_Kevin-CSDN博客 收錄專欄;《Java》 在 Java 企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中,Spring 框架已經(jīng)成為了事實(shí)上的標(biāo)準(zhǔn)。它提供了一種輕量級(jí)的解決方案,使得開(kāi)發(fā)者能夠更輕松地構(gòu)建靈活、可擴(kuò)展的應(yīng)用程序。在本文中,我們將探討 Spring 框架的一些核心概念和基本用法,以此更好地

    2024年03月20日
    瀏覽(22)
  • Spring5深入淺出篇:Spring與工廠設(shè)計(jì)模式簡(jiǎn)介

    Spring5深入淺出篇:Spring與工廠設(shè)計(jì)模式簡(jiǎn)介

    輕量級(jí) JavaEE的解決?案 spring實(shí)際上就是對(duì)原有設(shè)計(jì)模式的一種高度封裝和整合 整合設(shè)計(jì)模式 工廠設(shè)計(jì)模式 什么是工廠設(shè)計(jì)模式 當(dāng)UserServiceImpl發(fā)生變化是會(huì)影響到userService等相關(guān)聯(lián)的類,在線上環(huán)境不利于維護(hù)

    2024年01月18日
    瀏覽(33)
  • Spring5深入淺出篇:bean的生命周期

    Spring5深入淺出篇:bean的生命周期

    指的是?個(gè)對(duì)象創(chuàng)建、存活、消亡的?個(gè)完整過(guò)程 由Spring負(fù)責(zé)對(duì)象的創(chuàng)建、存活、銷毀,了解?命周期,有利于我們使?好Spring為我們創(chuàng)建的對(duì)象 創(chuàng)建階段 Spring??何時(shí)創(chuàng)建對(duì)象 當(dāng)bean標(biāo)簽中增加scope=\\\"singleton\\\"時(shí),當(dāng)你創(chuàng)建對(duì)象所有的引用都是第一個(gè)對(duì)象的內(nèi)存地址;sigleton:只

    2024年04月12日
    瀏覽(29)
  • 【深入淺出Spring原理及實(shí)戰(zhàn)】「源碼調(diào)試分析」深入源碼探索Spring底層框架的的refresh方法所出現(xiàn)的問(wèn)題和異常

    閱讀Spring官方文檔,了解Spring框架的基本概念和使用方法。 下載Spring源碼,可以從官網(wǎng)或者GitHub上獲取。 閱讀Spring源碼的入口類,了解Spring框架的啟動(dòng)過(guò)程和核心組件的加載順序。 閱讀Spring源碼中的注釋和文檔,了解每個(gè)類和方法的作用和用法。 調(diào)試Spring源碼,可以通過(guò)

    2023年04月23日
    瀏覽(33)
  • Spring高手之路14——深入淺出:SPI機(jī)制在JDK與Spring Boot中的應(yīng)用

    Spring高手之路14——深入淺出:SPI機(jī)制在JDK與Spring Boot中的應(yīng)用

    ?? SPI ( Service Provider Interface ) 是一種服務(wù)發(fā)現(xiàn)機(jī)制,它允許第三方提供者為核心庫(kù)或主框架提供實(shí)現(xiàn)或擴(kuò)展。這種設(shè)計(jì)允許核心庫(kù)/框架在不修改自身代碼的情況下,通過(guò)第三方實(shí)現(xiàn)來(lái)增強(qiáng)功能。 JDK原生的SPI : 定義和發(fā)現(xiàn) : JDK 的 SPI 主要通過(guò)在 META-INF/services/ 目錄下放置

    2024年02月09日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包