// An example of parsing the error types using bitfield checks func ExampleParse_errorChecking() { // Token from another example. This token is expired var tokenString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c" token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { return []byte("AllYourBase"), nil }) if token.Valid { fmt.Println("You look nice today") } else if ve, ok := err.(*jwt.ValidationError); ok { if ve.Errors&jwt.ValidationErrorMalformed != 0 { fmt.Println("That's not even a token") } else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 { // Token is either expired or not active yet fmt.Println("Timing is everything") } else { fmt.Println("Couldn't handle this token:", err) } } else { fmt.Println("Couldn't handle this token:", err) } // Output: Timing is everything }
// Parse parses the SAMLResponse func (sp *ServiceProvider) Parse(w http.ResponseWriter, r *http.Request) (*Assertion, error) { allowIdPInitiated := "" possibleRequestIDs := []string{allowIdPInitiated} // Find the request id that relates to this RelayState. relayState := r.PostFormValue("RelayState") if sp.cookieSecret() != nil && relayState != "" { cookieName := fmt.Sprintf("saml_%s", relayState) cookie, err := r.Cookie(cookieName) if err != nil { return nil, fmt.Errorf("cannot find %s cookie", cookieName) } // Verify the integrity of the cookie. state, err := jwt.Parse(cookie.Value, func(t *jwt.Token) (interface{}, error) { return sp.cookieSecret(), nil }) if err != nil || !state.Valid { return nil, fmt.Errorf("could not decode state JWT: %v", err) } claims := state.Claims.(jwt.MapClaims) id := claims["id"].(string) possibleRequestIDs = append(possibleRequestIDs, id) // delete the cookie cookie.Value = "" cookie.Expires = time.Time{} http.SetCookie(w, cookie) } samlResponse := r.PostFormValue("SAMLResponse") return sp.ParseSAMLResponse(samlResponse, possibleRequestIDs) }
// Example parsing and validating a token using the HMAC signing method func ExampleParse_hmac() { // sample token string taken from the New example tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJuYmYiOjE0NDQ0Nzg0MDB9.u1riaD1rW97opCoAuRCTy4w58Br-Zk-bh7vLiRIsrpU" // Parse takes the token string and a function for looking up the key. The latter is especially // useful if you use multiple keys for your application. The standard is to use 'kid' in the // head of the token to identify which key to use, but the parsed token (head and claims) is provided // to the callback, providing flexibility. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { // Don't forget to validate the alg is what you expect: if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } return hmacSampleSecret, nil }) if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { fmt.Println(claims["foo"], claims["nbf"]) } else { fmt.Println(err) } // Output: bar 1.4444784e+09 }