>  기사  >  백엔드 개발  >  Go에서 Azure JWT 유효성 검사가 작동하지 않습니다.

Go에서 Azure JWT 유효성 검사가 작동하지 않습니다.

WBOY
WBOY앞으로
2024-02-09 11:12:09966검색

Go 中的 Azure JWT 验证不起作用

Go 언어를 사용하여 Azure 애플리케이션을 개발할 때 JWT(JSON Web Token) 확인이 작동하지 않는 문제에 자주 직면합니다. JWT는 웹 애플리케이션 간에 클레임을 전달하기 위한 안전한 전송 방법이지만 Go에서 Azure의 JWT 유효성 검사를 사용할 때 다양한 문제가 발생하는 경우가 있습니다. 이 문서에서는 JWT 확인이 작동하지 않는 몇 가지 가능한 이유를 소개하고 이 일반적인 문제를 해결하는 데 도움이 되는 해당 솔루션을 제공합니다. 이 기사는 PHP 편집자 Apple이 신중하게 편집한 것이며, 귀하에게 도움이 되기를 바랍니다.

질문 내용

go http 서버가 있습니다. Azure JWT 토큰을 사용하여 경로를 보호하고 싶습니다. 토큰을 생성할 수 있지만 확인할 수는 없습니다.

내가 하는 일은 다음과 같습니다.

으아악

verify2(..) 给出 2d77b2345c34a631c3d251f57ce68620 未能匹配任何键 그리고 verify(..) 给出 crypto/rsa: 验证错误

내 jwt 헤더:

package main

import (
    "context"
    "errors"
    "fmt"

    "github.com/dgrijalva/jwt-go"
    "github.com/lestrrat-go/jwx/jwa"
    "github.com/lestrrat-go/jwx/jwk"
    njwt "github.com/lestrrat-go/jwx/jwt"
)

const token = "<access-token>"

const jwksurl = `https://login.microsoftonline.com/common/discovery/keys`

func main() {
    set, _ := jwk.fetch(context.todo(), jwksurl)
    // verified that set has required kid 
    verify2(token, set)
    token, err := verify(token, set)
    // token, err := jwt.parse(token, getkey)
    if err != nil {
        panic(err)
    }
    claims := token.claims.(jwt.mapclaims)
    for key, value := range claims {
        fmt.printf("%s\t%v\n", key, value)
    }
}

func verify2(token string, keyset jwk.set) {
    btoken := []byte(token)
    parsedtoken, err := njwt.parse(
        btoken, //token is a []byte
        njwt.withkeyset(keyset),
        njwt.withvalidate(true),
    )
    fmt.printf("%v %v", parsedtoken, err)
}

func verify(tokenstring string, keyset jwk.set) (*jwt.token, error) {
    tkn, err := jwt.parse(tokenstring, func(token *jwt.token) (interface{}, error) {
        if token.method.alg() != jwa.rs256.string() {
            return nil, fmt.errorf("unexpected signing method: %v", token.header["alg"])
        }
        kid, ok := token.header["kid"].(string)
        if !ok {
            return nil, errors.new("kid header not found")
        }
        keys, ok := keyset.lookupkeyid(kid)
        if !ok {
            return nil, fmt.errorf("key %v not found", kid)
        }
        var raw interface{}
        err := keys.raw(&raw)
        return raw, err
    })
    return tkn, err
}

해결 방법

잘못된 유형의 Azure AD 액세스 토큰을 사용하고 있습니다. JWT 헤더에 nonce가 있는 콘텐츠는 자체 API로 확인하기 위한 것이 아니며 Microsoft 자체 API를 위한 것입니다.

이 문제를 해결하려면 API 범위를 노출해야 하며, 그 후에는 JWT 헤더에 nonce가 없는 액세스 토큰을 얻게 됩니다. 내 블로그 게시물에는 추가 관련 정보가 있습니다.

위 내용은 Go에서 Azure JWT 유효성 검사가 작동하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제