찾다
백엔드 개발GolangGin 프레임워크를 사용하여 API 게이트웨이와 인증 및 권한 부여 기능 구현

현대 인터넷 아키텍처에서 API 게이트웨이는 중요한 구성 요소가 되었으며 기업 및 클라우드 컴퓨팅 시나리오에서 널리 사용됩니다. API 게이트웨이의 주요 기능은 여러 마이크로서비스 시스템의 API 인터페이스를 균일하게 관리 및 배포하고 액세스 제어 및 보안 보호를 제공하며 API 문서 관리, 모니터링 및 로깅도 수행할 수 있습니다.

API 게이트웨이의 보안과 확장성을 더 잘 보장하기 위해 일부 액세스 제어, 인증 및 권한 부여 메커니즘도 API 게이트웨이에 추가되었습니다. 이러한 메커니즘은 사용자와 서비스 간의 합법성을 보장하고 공격과 불법적인 운영을 방지할 수 있습니다.

이 글에서는 Gin 프레임워크를 사용하여 API 게이트웨이와 인증 및 권한 부여 기능을 구현하는 방법을 소개합니다.

1. Gin 프레임워크 소개

Gin은 Go 언어를 기반으로 개발된 경량 웹 프레임워크입니다. 디자인 목표는 단순성과 사용 편의성을 유지하면서 고성능 웹 프레임워크를 제공하는 것입니다. Gin 프레임워크는 라우팅, 미들웨어, 템플릿 및 렌더링과 같은 일반적인 웹 기능을 제공하며 사용자 정의 미들웨어 및 HTTP 오류 처리 방법도 지원하므로 요구 사항에 맞는 웹 애플리케이션을 빠르게 만들 수 있습니다.

2. API 게이트웨이의 기본 프레임워크 구축

먼저 기본 웹 애플리케이션을 생성하려면 Gin 프레임워크를 설치하고 가져와야 합니다. 그 전에 로컬 환경에 Go 언어를 설치한 후, 다음 명령을 실행하여 Gin 프레임워크를 설치해야 합니다.

go get -u github.com/gin-gonic/gin

다음으로 프로그램의 엔트리 파일로 main.go 파일을 생성합니다.

package main

import "github.com/gin-gonic/gin"

func main() {
    router := gin.Default()
    router.Any("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "Hello, Gin!",
        })
    })
    router.Run(":8080")
}

위 코드에서는 Gin 프레임워크 라이브러리를 가져오고 기본 경로를 생성했습니다. 경로의 루트 경로("/")는 모든 요청 메서드(Any)에 대해 JSON 형식의 응답 정보를 반환할 수 있습니다. 마지막으로 Run 메서드를 통해 HTTP 서비스를 시작하고 로컬 포트 ​​8080을 수신했습니다.

이제 터미널에 다음 명령어를 입력하여 프로그램을 시작하고 정상적으로 서비스가 되는지 확인할 수 있습니다.

go run main.go

모든 것이 정상이라면 브라우저나 다른 클라이언트에서 http://localhost:8080/에 액세스하여 JSON 형식으로 다음 응답을 볼 수 있어야 합니다.

{ "message": "Hello, Gin!" }

3. API 게이트웨이 구현

다음으로 API 게이트웨이를 구현하겠습니다. API 게이트웨이를 구현하기 전에 API 게이트웨이에 어떤 서비스가 포함될지 결정해야 합니다. 여기서는 사용자 관리 시스템, 제품 관리 시스템, 주문 관리 시스템이 있고 이 세 시스템에는 자체 API 인터페이스가 있다고 가정합니다.

이 세 시스템의 API 인터페이스를 API 게이트웨이에 통합하려면 경로를 그룹화하고 전달해야 합니다. 더 간단한 방법은 기능에 따라 다양한 마이크로서비스를 그룹화하는 것입니다. 예를 들어 라우팅은 다음과 같이 정의할 수 있습니다.

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    router := gin.Default()

    userService := router.Group("/user-service")
    {
        userService.GET("/", func(c *gin.Context) {
            c.JSON(http.StatusOK, gin.H{"data": "User Service API"})
        })
    }

    productService := router.Group("/product-service")
    {
        productService.GET("/", func(c *gin.Context) {
            c.JSON(http.StatusOK, gin.H{"data": "Product Service API"})
        })
    }

    orderService := router.Group("/order-service")
    {
        orderService.GET("/", func(c *gin.Context) {
            c.JSON(http.StatusOK, gin.H{"data": "Order Service API"})
        })
    }

    router.Run(":8080")
}

위 코드 예제에서는 Gin 프레임워크의 그룹 방법을 사용하여 다양한 서비스의 경로를 그룹화하고 /user-service, /product-service 및 /order-service의 세 가지 경로 아래에 배치했습니다. 그런 다음 다양한 서비스에 대한 경로를 추가하고 각각 다른 응답 정보를 지정합니다. 여기서는 간단한 문자열만 반환됩니다.

지금 프로그램을 실행하고 각 서비스에 접속하면 다음 정보가 표시됩니다.

http://localhost:8080/user-service/는 {"data": "User Service API"를 반환합니다.}
http://localhost:8080/product-service/는 {"data": "Product Service API"를 반환합니다. }
http://localhost:8080/order-service/ 반환 {"data": "Order Service API"}

4. 인증 및 승인 구현

API 게이트웨이의 보안과 확장성을 보장하기 위해, 또한 인증 및 권한 부여 메커니즘을 추가해야 합니다. 여기서는 JWT(JSON Web Token)를 사용하여 인증 및 권한 부여 기능을 구현할 수 있습니다. JWT는 웹 표준을 기반으로 하는 경량 인증 및 권한 부여 방법입니다. JWT 인증 과정은 다음과 같습니다.

  1. 사용자는 ID 정보(사용자 이름, 비밀번호 등)를 전달하는 API 게이트웨이를 요청합니다.
  2. API 게이트웨이는 ID 정보를 사용하여 인증 서버에 요청을 보내고 JWT 토큰을 얻습니다.
  3. API 게이트웨이는 JWT 토큰을 요청 헤더 또는 기타 위치에 첨부하고 인터페이스 액세스를 위해 서버로 전달합니다.
  4. 서버는 JWT 토큰을 기반으로 인터페이스 액세스를 수행하고 인증 및 권한 부여 작업을 자동으로 완료합니다.

JWT 사용을 지원하려면 다음 라이브러리도 설치해야 합니다.

go get -u github.com/dgrijalva/jwt-go

다음으로 JWT 클레임 구조를 정의하고 UserID 및 Expiry 정보와 같은 몇 가지 필수 매개변수를 추가해야 합니다. 여기서 UserID는 사용자의 고유 ID를 기록하는 데 사용되고 Expiry는 토큰의 유효 기간을 기록하는 데 사용됩니다.

type CustomClaims struct {
    UserID string `json:"userID,omitempty"`
    jwt.StandardClaims
}

다음으로 generateToken, verifyToken 및 authMiddleware의 세 가지 기능을 구현하겠습니다. generateToken 함수는 JWT 토큰을 생성하는 데 사용됩니다. 구체적인 구현은 다음과 같습니다.

func generateToken(userID string) (string, error) {
    claims := CustomClaims{
        userID,
        jwt.StandardClaims{
            ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
            Issuer:    "my-api-gateway",
        },
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    jwtSecret := []byte("my-secret-key")
    return token.SignedString(jwtSecret)
}

위 코드에서는 CustomClaims 구조의 인스턴스를 생성하고, userID를 Claims의 매개변수로 사용하고, 만료 시간과 발급자 정보 Issuer를 지정합니다. 그런 다음 HS256 알고리즘을 사용하여 클레임에 서명하고 SignedString 메서드를 호출하여 JWT 토큰을 생성한 후 클라이언트에 반환합니다.

다음으로 토큰을 검증하기 위해 verifyToken 함수를 구현하겠습니다.

func verifyToken(tokenString string) (*CustomClaims, error) {
    jwtSecret := []byte("my-secret-key")
    token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
        return jwtSecret, nil
    })
    if err != nil {
        return nil, err
    }
    if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
        return claims, nil
    }
    return nil, errors.New("invalid token")
}

在上面的代码中,我们首先定义了一个JWT Secret(这里我们使用字符串"my-secret-key"作为密钥),然后使用ParseWithClaims方法解析令牌,并将Claims参数设置为CustomClaims类型。然后,我们使用定义的JWT Secret对令牌进行验证,如果验证通过,我们将返回Claims结构体的实例。

最后一个函数是authMiddleware,用于检查请求头中是否携带有效的JWT令牌。如果没有携带或验证失败,中间件将会返回401错误给客户端。

func authMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        authHeader := c.GetHeader("Authorization")

        if authHeader == "" {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
            return
        }

        tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
        claims, err := verifyToken(tokenString)

        if err != nil {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
            return
        }

        c.Set("userID", claims.UserID)
        c.Next()
    }
}

在上面的代码中,我们首先从请求头中获取Authorization信息,并判断是否为空。如果为空,返回401错误。然后,我们使用strings.Replace方法将Token中的Bearer前缀进行删除,获取真正的JWT令牌。接着,我们调用verifyToken函数对JWT令牌进行验证,如果验证不通过,返回401错误。最后,我们将userID存储在Context中,以备其他中间件和路由使用。

为了演示JWT认证的功能,我们在/user-service服务中添加一个需要身份验证的路由,例如/user-service/profile,它返回用户的详细信息。修改后的main.go代码示例如下。

func main() {
    router := gin.Default()

    userService := router.Group("/user-service")
    {
        userService.GET("/", func(c *gin.Context) {
            c.JSON(http.StatusOK, gin.H{"data": "User Service API"})
        })
        userService.GET("/profile", authMiddleware(), func(c *gin.Context) {
            userID := c.MustGet("userID").(string)
            c.JSON(http.StatusOK, gin.H{"data": "User ID: " + userID})
        })
    }

    productService := router.Group("/product-service")
    {
        productService.GET("/", func(c *gin.Context) {
            c.JSON(http.StatusOK, gin.H{"data": "Product Service API"})
        })
    }

    orderService := router.Group("/order-service")
    {
        orderService.GET("/", func(c *gin.Context) {
            c.JSON(http.StatusOK, gin.H{"data": "Order Service API"})
        })
    }

    router.Run(":8080")
}

以上代码中,我们在/user-service/profile路由中使用了authMiddleware中间件,来对身份进行验证。例如,如果你想要访问/user-service/profile接口,你需要在请求头中附带有效的JWT令牌,例如:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySURfaWQiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjMyMzMzNjE0LCJpc3MiOiJteS1hcGktZ2F0ZXdheSJ9OfXlna_Qb2giRByaev2x7w5zz0S2CJZnMMgZ6sVA

如果你尝试访问此路由,但请求头中没有附带有效的JWT令牌,或者令牌验证失败,你将会得到以下JSON格式的响应。

{ "error": "Unauthorized" }

如果你携带了有效的JWT令牌,你应该可以看到以下格式的响应。

{ "data": "User ID: 1234567890" }

五、总结

在本文中,我们介绍了如何使用Gin框架来实现API网关和认证授权功能。我们创建了一个基本的Web应用程序,并将多个微服务系统的API接口纳入到API网关当中。为了提高API网关的安全性和可扩展性,我们使用了JWT认证和授权的机制,通过设置Claims结构体参数来生成和验证JWT令牌,最后使用了AuthMiddleware来检查请求头中的JWT令牌。

위 내용은 Gin 프레임워크를 사용하여 API 게이트웨이와 인증 및 권한 부여 기능 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Golang vs. Python : 동시성 및 멀티 스레딩Golang vs. Python : 동시성 및 멀티 스레딩Apr 17, 2025 am 12:20 AM

Golang은 높은 동시성 작업에 더 적합하지만 Python은 유연성에 더 많은 장점이 있습니다. 1. Golang은 Goroutine 및 채널을 통해 동시성을 효율적으로 처리합니다. 2. Python은 GIL의 영향을받는 스레딩 및 Asyncio에 의존하지만 여러 동시성 방법을 제공합니다. 선택은 특정 요구 사항을 기반으로해야합니다.

Golang 및 C : 성능 상충Golang 및 C : 성능 상충Apr 17, 2025 am 12:18 AM

Golang과 C의 성능 차이는 주로 메모리 관리, 컴파일 최적화 및 런타임 효율에 반영됩니다. 1) Golang의 쓰레기 수집 메커니즘은 편리하지만 성능에 영향을 줄 수 있습니다. 2) C의 수동 메모리 관리 및 컴파일러 최적화는 재귀 컴퓨팅에서 더 효율적입니다.

Golang vs. Python : 응용 프로그램 및 사용 사례Golang vs. Python : 응용 프로그램 및 사용 사례Apr 17, 2025 am 12:17 AM

선택 GOLANGFORHIGHERFERFERFORMANDCONDCURRENCY, TILDFORBECTERVICES 및 NNETWORKPRAMPHING; SELECTPYTHONFORRAPIDDEVENTURMENT, DATASCIENCE 및 MACHINEARNINGDUETOITSTINTIVENDEXTENDIVERIRIES.

Golang vs. Python : 주요 차이점과 유사성Golang vs. Python : 주요 차이점과 유사성Apr 17, 2025 am 12:15 AM

Golang과 Python은 각각 고유 한 장점이 있습니다. Golang은 고성능 및 동시 프로그래밍에 적합하지만 Python은 데이터 과학 및 웹 개발에 적합합니다. Golang은 동시성 모델과 효율적인 성능으로 유명하며 Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명합니다.

Golang vs. Python : 사용 편의성 및 학습 곡선Golang vs. Python : 사용 편의성 및 학습 곡선Apr 17, 2025 am 12:12 AM

Golang과 Python은 어떤 측면에서 사용하기 쉽고 부드러운 학습 곡선을 가지고 있습니까? Golang은 높은 동시성과 고성능 요구에 더 적합하며, 학습 곡선은 C 언어 배경을 가진 개발자에게는 비교적 온화합니다. Python은 데이터 과학 및 빠른 프로토 타이핑에 더 적합하며 학습 곡선은 초보자에게 매우 매끄 럽습니다.

공연 경주 : 골랑 대 c공연 경주 : 골랑 대 cApr 16, 2025 am 12:07 AM

Golang과 C는 각각 공연 경쟁에서 고유 한 장점을 가지고 있습니다. 1) Golang은 높은 동시성과 빠른 발전에 적합하며 2) C는 더 높은 성능과 세밀한 제어를 제공합니다. 선택은 프로젝트 요구 사항 및 팀 기술 스택을 기반으로해야합니다.

Golang vs. C : 코드 예제 및 성능 분석Golang vs. C : 코드 예제 및 성능 분석Apr 15, 2025 am 12:03 AM

Golang은 빠른 개발 및 동시 프로그래밍에 적합한 반면 C는 극심한 성능과 기본 제어가 필요한 프로젝트에 더 적합합니다. 1) Golang의 동시성 모델은 Goroutine 및 Channel을 통한 동시성 프로그래밍을 단순화합니다. 2) C의 템플릿 프로그래밍은 일반적인 코드 및 성능 최적화를 제공합니다. 3) Golang의 쓰레기 수집은 편리하지만 성능에 영향을 줄 수 있습니다. C의 메모리 관리는 복잡하지만 제어는 괜찮습니다.

Golang의 영향 : 속도, 효율성 및 단순성Golang의 영향 : 속도, 효율성 및 단순성Apr 14, 2025 am 12:11 AM

goimpactsdevelopmentpositively throughlyspeed, 효율성 및 단순성.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기