Created
January 22, 2015 14:43
-
-
Save artefactop/1904df6ed50fb5ecafc1 to your computer and use it in GitHub Desktop.
jwt example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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