Spring Boot整合OAuth2實現GitHub第三方登錄

来源:https://www.cnblogs.com/atwood-pan/archive/2023/10/25/17787904.html
-Advertisement-
Play Games

Github OAuth 第三方登錄示例 1、第三方登錄原理 第三方登錄的原理是藉助OAuth授權來實現,首先用戶先向客戶端提供第三方網站的數據證明自己的身份獲取授權碼,然後客戶端拿著授權碼與授權伺服器建立連接獲得一個Access Token,之後客戶端就可以通過Access Token來與資源服務 ...


Github OAuth 第三方登錄示例

1、第三方登錄原理

第三方登錄的原理是藉助OAuth授權來實現,首先用戶先向客戶端提供第三方網站的數據證明自己的身份獲取授權碼,然後客戶端拿著授權碼與授權伺服器建立連接獲得一個Access Token,之後客戶端就可以通過Access Token來與資源伺服器進行交互。

使用OAuth的好處是提供給用戶一個特定的密鑰,用戶持有這個密鑰可以訪問應用中的任何信息,而不需要向網站提供用戶名&密碼,可以實現跨系統共用用戶授權協議。

通過控制用戶持有的密鑰,可以很方便的控制用戶可以訪問的資源,以及控制密鑰的過期時間。

以下是來自維基百科對於OAuth的介紹

開放授權(OAuth)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。

OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth讓用戶可以授權第三方網站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內容。

OAuth是OpenID的一個補充,但是完全不同的服務。

交互流程如下:

2、GitHub實現第三方登錄

首先需要在github中對應用進行登記,讓Github知道誰在發送請求。

訪問這個網址,填寫登記表

提交成功之後,GitHub會返回Client ID & Client Secrets ,這是應用的身份識別碼

創建一個SpringBoot工程,pom.xml文件內容如下:

<?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.7.17</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.pp</groupId>
    <artifactId>springboot-oauth2-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-oauth2-api</name>
    <description>springboot整合oauth2,實現GitHub第三方登錄</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

將ID和密鑰添加到配置文件application.yml中:

# 項目埠號
server:
  port: 8080
#  GitHub認證相關參數
github:
    client:
      id: xxx
      secret: xxx

創建一個實體類,用於映射授權成功產生的Token令牌:

import com.fasterxml.jackson.annotation.JsonProperty;
/**
 *
 * Token令牌 - 響應參數
 *
 * @author supanpan
 * @date 2023/10/25
 */
public class AccessTokenResponse {

    @JsonProperty("access_token")
    private String accessToken;

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }
}

OAuthController如下:

**
 * @author supanpan
 * @date 2023/10/25
 */
@Controller
public class OAuthController {

    @Value("${github.client.id}")
    private String clientId;

    @Value("${github.client.secret}")
    private String clientSecret;

    @GetMapping("/oauth/redirect")
    public String handleRedirect(@RequestParam("code") String requestToken, Model model) {
        // 使用RestTemplate來發送HTTP請求
        RestTemplate restTemplate = new RestTemplate();

        // 獲取Token的Url
        String tokenUrl = "https://github.com/login/oauth/access_token" +
                "?client_id=" + clientId +
                "&client_secret=" + clientSecret +
                "&code=" + requestToken;

        // 使用restTemplate向GitHub發送請求,獲取Token
        AccessTokenResponse tokenResponse = restTemplate.postForObject(tokenUrl, null, AccessTokenResponse.class);

        // 從響應體中獲取Token數據
        String accessToken = tokenResponse.getAccessToken();

        // 攜帶Token向GitHub發送請求
        String apiUrl = "https://api.github.com/user";
        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", "token " + accessToken);
        HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
        ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.GET, entity, String.class);
        model.addAttribute("userData", response.getBody());

        return "welcome";
    }
}

SpringBoot啟動器

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootOauth2ApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootOauth2ApiApplication.class, args);
    }

}

還需要編寫兩個html頁面,index.html和welcome.html

index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>OAuth2 Demo</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
<a id="login">Login with GitHub</a>

<script>
    const client_id = 'xxxx';

    const authorize_uri = 'https://github.com/login/oauth/authorize';
    const redirect_uri = 'http://localhost:8080/oauth/redirect';

    const link = document.getElementById('login');
    link.href = `${authorize_uri}?client_id=${client_id}&redirect_uri=${redirect_uri}`;
</script>

</body>

</html>

welcome.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Hello</title>
</head>

<body>
    <h1>Welcome</h1>
    <div th:text="${userData}"></div>
</body>

</html>

啟動項目,瀏覽器訪問localhost:8080,會跳轉到index頁面,點擊鏈接會跳轉到GitHub應用授權頁面

點擊跳轉到GitHub授權之後,GitHub會詢問示例代碼正在請求數據,您是否同意授權。

用戶同意授權, GitHub 就會跳轉到redirect_uri指定的跳轉網址,並且帶上授權碼,跳轉回來的 URL 就是下麵的樣子

// code參數就是授權碼
http://localhost:8080/oauth/redirect?code:4ea423f2ec1e04c6376a

如下是服務的響應數據:

access token: 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
{
  login: 'AtwoodPa',
  id: 110728122,
  node_id: 'U_kgDOBpmTug',
  avatar_url: 'https://avatars.githubusercontent.com/u/110728122?v=4',
  gravatar_id: '',
  url: 'https://api.github.com/users/AtwoodPa',
  html_url: 'https://github.com/AtwoodPa',
  followers_url: 'https://api.github.com/users/AtwoodPa/followers',
  following_url: 'https://api.github.com/users/AtwoodPa/following{/other_user}',
  gists_url: 'https://api.github.com/users/AtwoodPa/gists{/gist_id}',
  starred_url: 'https://api.github.com/users/AtwoodPa/starred{/owner}{/repo}',
  subscriptions_url: 'https://api.github.com/users/AtwoodPa/subscriptions',
  organizations_url: 'https://api.github.com/users/AtwoodPa/orgs',
  repos_url: 'https://api.github.com/users/AtwoodPa/repos',
  events_url: 'https://api.github.com/users/AtwoodPa/events{/privacy}',
  received_events_url: 'https://api.github.com/users/AtwoodPa/received_events',
  type: 'User',
  site_admin: false,
  name: null,
  company: null,
  blog: '',
  location: null,
  email: null,
  hireable: null,
  bio: null,
  twitter_username: null,
  public_repos: 6,
  public_gists: 0,
  followers: 0,
  following: 3,
  created_at: '2022-08-06T13:02:16Z',
  updated_at: '2023-09-03T00:15:55Z'
}
authorization code: 4ea423f2ec1e04c6376a

成功執行上述流程,最終展示示例的welcome頁面

到這裡,Spring Boot整合GitHub實現第三方登錄的實現就結束了,以此類推其他廠商的第三方登錄實現流程也大概是這樣。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著社交媒體的快速發展,微博已成為了人們獲取信息的重要途徑。而在微博中,用戶和話題的排行榜更是引起了人們的廣泛關註。那麼如何獲取微博用戶和話題排行榜呢?下麵介紹一下基於微博排行榜API介面的方法。 一、獲取微博用戶排行榜API介面 微博用戶排行榜API介面是一種用於獲取微博用戶排名的介面。我們可以使 ...
  • Synchronized Synchronized關鍵字回顧 synchronized是java中的關鍵字,是一種同步鎖。它修飾的對象有以下幾種: 1.修飾一個代碼塊,被修飾的代碼塊稱為同步代碼塊,其作用的範圍是大括弧{},括起來的代碼,作用的對象是調用這個代碼塊的對象,synchronized不能 ...
  • 1. BaseHTTPRequestHandler介紹 BaseHTTPRequestHandler是Python中的一個基類,屬於http.server模塊,用於處理HTTP請求的基本功能。它提供了處理常見HTTP請求方法(如GET、POST等)的預設實現,並允許你在子類中進行定製化擴展。下麵詳細 ...
  • Dart語言和其他面向對象語言一樣,子類可以繼承父類,獲得父類的屬性和方法。那麼Dart語言,類繼承還有什麼特性呢…… ...
  • 源碼位置: /Lib/zipfile.py/ZipFile/_extract_member/zipfile.py或者直接點擊extract函數. 在使用python解壓縮zip文件時, 由於需要在解壓時重命名文件為我想要的格式, 而不巧的是, zipfile包官方源代碼沒有這個功能... 於是, 在 ...
  • 起因 在Leetcode上做題寫了兩種暴力解法,但是執行效率上不太一樣。 時間上差很遠,記憶體雖然差不多但是前者擊敗30%,後者擊敗94%。這兩種解法區別是用一條ArrayList還是兩條來存數據,所以contains雖然執行次數一樣但是檢測的長度上不一樣,而且ArrayList的擴容次數也不一樣,所 ...
  • 哈嘍大家好,我是鹹魚 我們知道,python 腳本或者說 python 程式其實是一個包含了 python 代碼的文件。要讓它們實現特定功能,我們需要知道該如何運行(run)它 通過運行 python 代碼,我們可以驗證腳本/程式是否按照我們的期望執行。這也使我們能夠對其進行測試和調試,以便找到並修 ...
  • Python 是一種面向對象的編程語言。在 Python 中,幾乎所有東西都是對象,都具有其屬性和方法。 類似於對象構造函數或用於創建對象的“藍圖”的類。 創建一個類 要創建一個類,請使用關鍵字 class: 示例,創建一個名為 MyClass 的類,其中包含一個名為 x 的屬性: class My ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...