//make token core func makeTokenCore(issuer, subject, audience string, expiration int, access []*token.ResourceActions, signingKey libtrust.PrivateKey) (t *token.Token, expiresIn int, issuedAt *time.Time, err error) { joseHeader := &token.Header{ Type: "JWT", SigningAlg: "RS256", KeyID: signingKey.KeyID(), } jwtID, err := randString(16) if err != nil { return nil, 0, nil, fmt.Errorf("Error to generate jwt id: %s", err) } now := time.Now().UTC() issuedAt = &now expiresIn = expiration * 60 claimSet := &token.ClaimSet{ Issuer: issuer, Subject: subject, Audience: audience, Expiration: now.Add(time.Duration(expiration) * time.Minute).Unix(), NotBefore: now.Unix(), IssuedAt: now.Unix(), JWTID: jwtID, Access: access, } var joseHeaderBytes, claimSetBytes []byte if joseHeaderBytes, err = json.Marshal(joseHeader); err != nil { return nil, 0, nil, fmt.Errorf("unable to marshal jose header: %s", err) } if claimSetBytes, err = json.Marshal(claimSet); err != nil { return nil, 0, nil, fmt.Errorf("unable to marshal claim set: %s", err) } encodedJoseHeader := base64UrlEncode(joseHeaderBytes) encodedClaimSet := base64UrlEncode(claimSetBytes) payload := fmt.Sprintf("%s.%s", encodedJoseHeader, encodedClaimSet) var signatureBytes []byte if signatureBytes, _, err = signingKey.Sign(strings.NewReader(payload), crypto.SHA256); err != nil { return nil, 0, nil, fmt.Errorf("unable to sign jwt payload: %s", err) } signature := base64UrlEncode(signatureBytes) tokenString := fmt.Sprintf("%s.%s", payload, signature) t, err = token.NewToken(tokenString) return }
func (t *TokenAuth) Verify(rawToken string, fn func(access ResourceActions) error) error { verifyOpts := token.VerifyOptions{ TrustedIssuers: []string{t.Issuer}, AcceptedAudiences: []string{t.Service}, Roots: t.rootCerts, TrustedKeys: t.trustedKeys, } token, err := token.NewToken(rawToken) if err != nil { return err } err = token.Verify(verifyOpts) if err != nil { return err } return fn(token.Claims.Access) }