Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mendapatkan kebenaran daripada token Auth0 jwt menggunakan go gin

Bagaimana untuk mendapatkan kebenaran daripada token Auth0 jwt menggunakan go gin

WBOY
WBOYke hadapan
2024-02-12 15:09:07980semak imbas

如何使用 go gin 从 Auth0 jwt 令牌检索权限

Kandungan soalan

Saya sedang belajar pergi dan ingin menyediakan aplikasi mudah menggunakan auth0. Menggunakan tutorial mereka, saya dapat menyediakan pengesahan asas untuk titik akhir api saya. Sekarang saya ingin menambah pengendalian kebenaran menggunakan token jwt. Jadi saya mengaktifkan RBAC untuk titik akhir api dan menambah kebenaran. Saya menggunakan aliran daripada tutorial untuk pengisytiharan tersuai, tetapi menulis middleware saya sendiri dengannya dan menyesuaikannya untuk berfungsi dengan Gin.

func NeedsPermission(expectedScope string) gin.HandlerFunc {
    return func(context *gin.Context) {
        token := context.Request.Context().Value(jwtmiddleware.ContextKey{}).(*validator.ValidatedClaims)

        claims := token.CustomClaims.(*CustomClaims)

        if !claims.HasScope(expectedScope) {
            context.AbortWithStatus(403)
        }
        context.Next()
    }
}

Masalahnya ialah tiada tuntutan tersuai dalam token, hanya tuntutan lalai: tuntutan openid, profil dan e-mel.

Ini adalah kandungan token:

{
  "iss": "https://dev-****.us.auth0.com/",
  "sub": "google-oauth2|****",
  "aud": [
    "localhost:3000/books",
    "https://dev-****.us.auth0.com/userinfo"
  ],
  "iat": 1701789297,
  "exp": 1701875697,
  "azp": "***",
  "scope": "openid profile email",
  "permissions": [
    "read:books"
  ]
}

Jadi, ia mempunyai kebenaran medan, tetapi bagaimana saya boleh mengaksesnya menggunakan perisian auth0/go-jwt-middleware atau adakah saya perlu menyahkodnya terlebih dahulu?

Penyelesaian

Kebenaran ialah pengisytiharan tersuai, jadi anda perlu lulus WithCustomClaims 选项以及 validator.CustomClaims pelaksanaan antara muka. Kemudian apabila anda mencipta pengesah:

...
    jwtValidator, _ := validator.New(
        keyFunc,
        validator.HS256,
        issuer,
        audience,
        validator.WithCustomClaims(func() validator.CustomClaims {
            return &MyClaims{}
        }),
    )
    mw := jwtmiddleware.New(jwtValidator.ValidateToken)
    ...

Antaranya MyClaims 是这样的。请注意您的 HasScope kaedah:

type MyClaims struct {
    Permissions    []string `json:"permissions"`
}

func (c *MyClaims) Validate(ctx context.Context) error {
    // Validate structure of permissions here, i.e. check for 400 not 403
    return nil
}

func (c MyClaims) HasScope(requiredPerm string) bool {
    for _, perm := range c.Permissions {
        if perm == requiredPerm {
            return true
        }
    }
    return false
}

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan kebenaran daripada token Auth0 jwt menggunakan go gin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam