Skip to content

Instantly share code, notes, and snippets.

@artefactop
Created January 22, 2015 14:43
Show Gist options
  • Save artefactop/1904df6ed50fb5ecafc1 to your computer and use it in GitHub Desktop.
Save artefactop/1904df6ed50fb5ecafc1 to your computer and use it in GitHub Desktop.
jwt example
package main
import (
"errors"
"fmt"
"github.com/dgrijalva/jwt-go"
"time"
)
type User struct {
username string
}
func generateLoginToken(mySigningKey []byte, user User) (string, error) {
// Create the token
token := jwt.New(jwt.SigningMethodHS256)
token.Header["kind"] = "login"
// Set some claims
token.Claims["username"] = user.username
token.Claims["exp"] = time.Now().Add(time.Hour * 72).Unix()
// Sign and get the complete encoded token as a string
tokenString, err := token.SignedString(mySigningKey)
return tokenString, err
}
func parseLoginToken(myToken string, myLookupKey func(interface{}) (interface{}, error)) (User, error) {
token, err := jwt.Parse(myToken, func(token *jwt.Token) (interface{}, error) {
fmt.Println(myToken)
return myLookupKey(token.Header["kind"])
})
fmt.Println("token", token)
if token.Valid {
fmt.Println("You look nice today")
return User{token.Claims["username"].(string)}, nil
} else if ve, ok := err.(*jwt.ValidationError); ok {
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
fmt.Println("That's not even a token")
return User{}, err
} else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
// Token is either expired or not active yet
fmt.Println("Timing is everything")
return User{}, err
} else {
fmt.Println("Couldn't handle this token:", err)
return User{}, err
}
} else {
fmt.Println("Couldn't handle this token:", err)
return User{}, err
}
}
func look(kind interface{}) (interface{}, error) {
if str, ok := kind.(string); ok {
switch str {
case "login":
return []byte("mySigningKey"), nil
}
}
return "", errors.New("unknown jwt kind")
}
func main() {
user := User{"username"}
jwt, _ := generateLoginToken([]byte("mySigningKey"), user)
value, _ := parseLoginToken(jwt, look)
fmt.Println("value", value)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment