Generate a JWT from GitHub App PEM private key in Go

Viewed 71
1 Answers

The jwt-go library has all the tools you need, and is fairly well documented. You can find it at https://github.com/golang-jwt/jwt.

Assuming you understand what JWTs are and how they're structured, and that you can get that PEM key as a []byte, the process is roughly:

  1. Add "github.com/golang-jwt/jwt/v4" to your imports.
  2. Create a set of claims, which can include the RegisteredClaims type and any custom claims you may need.
  3. Create the token with jwt.NewWithClaims() - you'll need to provide the appropriate signing method. I've primarily used RS256.
  4. Create the JWT string from the token with token.SignedString().

In practice, it will look something like this:

imports "github.com/golang-jwt/jwt/v4"

type MyCustomClaims struct {
    *jwt.RegisteredClaims
    FooClaim int
    BarClaim string
}

func CreateJWT(pemKey []byte) string {
    // expires in 60 minutes
    expiration := time.Now().Add(time.Second * 3600)

    claims := MyCustomClaims{
        RegisteredClaims: &jwt.RegisteredClaims{
            Issuer:    "Example Code Inc.",
            ExpiresAt: jwt.NewNumericDate(expiration),
            Subject:   "JWT Creation",
        },
        FooClaim: 123,
        BarClaim: "bar",
    }

    token := jwt.NewWithClaims(jwt.SigningMethodRS256, claims)

    privateKey, _ := jwt.ParseRSAPrivateKeyFromPEM(pemKey)

    myJWT, _ := jwt.SignedString(privateKey)

    return myJWT
}
Related