Google의 공개 키를 사용하여 JWT의 서명을 수동으로 확인하려면 어떻게해야합니까?
Go 스크립트에서 Google 로그인을 구현하고 있는데 Google에서 ID 토큰에 서명했는지 확인하는 데 멈춰 있습니다.
특히 여기 에서 첫 번째 글 머리 기호를 수행하려고합니다 .
토큰을 가져 와서 헤더, 페이로드 및 서명으로 분할했습니다. 하지만 Google의 공개 키를 사용하여 서명을 확인하는 방법을 모르겠습니다.
서명 생성에 HMACSHA256 알고리즘이 포함된다는 것을 알았지 만 Google에서 제공하는 JWK 또는 PEM 키로 무엇을해야하는지 잘 모르겠습니다. 현재 특정 제한 사항으로 인해 수동으로 수행하고 있습니다.
누구든지 내가 서명을 확인할 수있는 방법을 알고 있습니까?
답변
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
}