Google의 공개 키를 사용하여 JWT의 서명을 수동으로 확인하려면 어떻게해야합니까?

Jan 21 2021

Go 스크립트에서 Google 로그인을 구현하고 있는데 Google에서 ID 토큰에 서명했는지 확인하는 데 멈춰 있습니다.

특히 여기 에서 첫 번째 글 머리 기호를 수행하려고합니다 .

토큰을 가져 와서 헤더, 페이로드 및 서명으로 분할했습니다. 하지만 Google의 공개 키를 사용하여 서명을 확인하는 방법을 모르겠습니다.

서명 생성에 HMACSHA256 알고리즘이 포함된다는 것을 알았지 만 Google에서 제공하는 JWK 또는 PEM 키로 무엇을해야하는지 잘 모르겠습니다. 현재 특정 제한 사항으로 인해 수동으로 수행하고 있습니다.

누구든지 내가 서명을 확인할 수있는 방법을 알고 있습니까?

답변

2 yebowhatsay Jan 21 2021 at 17:20

PHP 예제 살펴보기 https://github.com/googleapis/google-api-php-client/blob/2fb6e702aca5d68203fa737f89f6f774022494c6/src/AccessToken/Verify.php#L90, Google API는 RS256 (RSA Signature with SHA-256)을 사용하여 토큰에 서명 한 것으로 보입니다.

다음 코드는 서명을 확인하고 토큰을 구문 분석해야합니다. 코드에서 토큰을 분할 할 필요가 없습니다. "github.com/pascaldekloe/jwt"패키지의 jwt.RSACheck (token [] byte, key * rsa.PublicKey) (* jwt.Claims, error)는 모든 무거운 작업을 수행합니다.

keyLocation은 로컬에 저장된 Google 공개 키입니다.

package main

import "github.com/pascaldekloe/jwt"

//jwtValidator verifies and parses the JWT Token
func jwtValidator(token string, keyLocation string) (j *jwtToken, err error) {
    token := []byte(token)

    pubK, err := rsaPublicKey(keyLocation)
    if err != nil {
        return
    }

    // parses the token only if signature is valid
    claims, err := jwt.RSACheck(token, pubK)
    if err != nil {
        err = fmt.Errorf("token signature invalid %s", err)
        return
    }
    if !claims.Valid(time.Now()) {
        err = fmt.Errorf("token time constraints exceeded")
        return
    }

    j = &jwtToken{
        id:      claims.ID,
        issuer:  claims.Issuer,
        issued:  claims.Issued,
        subject: claims.Subject,
        expires: claims.Expires,
    }

    return
}