(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)流程圖:
- 用戶點(diǎn)擊登錄鏈接(按鈕),系統(tǒng)會(huì)將用戶導(dǎo)入授權(quán)服務(wù)器的登錄頁(yè)面,對(duì)應(yīng)著A(用戶-》瀏覽器-》認(rèn)證服務(wù)器響應(yīng)給瀏覽器);
- 用戶選擇是否給予授權(quán),這一階段進(jìn)行的是用戶選擇認(rèn)證階段,對(duì)應(yīng)著B(niǎo)。
- 如果用戶同意授權(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。
- 授權(quán)服務(wù)器對(duì)參數(shù)進(jìn)行校驗(yàn)之后,即認(rèn)證成功后會(huì)返回 Access Token 和 Refresh Token,即Authentication,這個(gè)過(guò)程對(duì)應(yīng)著E。
- 通過(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。
點(diǎn)擊 New OAuth app,添加新的應(yīng)用。需填寫(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è)):
注冊(cè)成功后會(huì)獲取到兩個(gè)參數(shù),Client ID
和 Client Secret
,保存這倆參數(shù),在配置項(xiàng)目中需要使用。
創(chuàng)建 Spring Boot 項(xiàng)目
- 需要的起步依賴
- 配置 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: /
- 創(chuàng)建測(cè)試接口(TestController)
@RestController
public class TestController {
@GetMapping("/test")
public DefaultOAuth2User test(){
System.out.println("Test Result~~~~");
return (DefaultOAuth2User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
}
- 創(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ò)濾的。
所以那授權(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)的)。
下面是我遇到的一些疑問(wèn),問(wèn)的ChatGpt的,如果有同樣的疑慮可以看看:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-498601.html
測(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é)我)。文章來(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)!