Skip to content

Instantly share code, notes, and snippets.

@thesyncim
Last active August 29, 2015 13:57
Show Gist options
  • Save thesyncim/9903506 to your computer and use it in GitHub Desktop.
Save thesyncim/9903506 to your computer and use it in GitHub Desktop.
package main
import (
"github.com/dgrijalva/jwt-go"
"log"
"net/http"
"time"
)
var (
secretKey = []byte("fucking_secretyyyyyyyyyyyyyyyyyyyyyyyyyyyu888kjyy8978uyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy")
duration = 72 * time.Hour
)
type Token struct {
key []byte
token *jwt.Token
duration time.Duration
}
func New() (t *Token) {
t = new(Token)
t.token = jwt.New(jwt.GetSigningMethod("HS256"))
t.duration = duration
t.key = secretKey
t.token.Claims["exp"] = time.Now().Add(t.duration).Unix()
return t
}
func (t *Token) Get(key string) interface{} {
return t.token.Claims[key]
}
func (t *Token) Set(key string, value interface{}) {
if key != "exp" {
t.token.Claims[key] = value
}
}
func (t *Token) Generate() (string, error) {
return t.token.SignedString(t.key)
}
func Parse(toke string) (*Token, error) {
t := new(Token)
t.key = secretKey
t.token = new(jwt.Token)
var err error
t.token, err = jwt.Parse(toke, func(token *jwt.Token) ([]byte, error) {
//todo implement extra validation
return t.key, nil
})
if err != nil {
return nil, err
}
return t, nil
}
func ParseFromReq(req *http.Request) (*Token, error) {
token := req.Header.Get("Authorization")
log.Println(token[:8])
t := new(Token)
t.key = secretKey
t.token = new(jwt.Token)
var err error
t.token, err = jwt.Parse(token[7:], func(token *jwt.Token) ([]byte, error) {
//todo implement extra validation
return t.key, nil
})
if err != nil {
return nil, err
}
return t, nil
}
func (t *Token) WriteHeader(rw http.ResponseWriter) error {
stoken, err := t.Generate()
if err != nil {
return err
}
respstring := `{ "token": "` + stoken + `" }`
rw.Write([]byte(respstring))
return nil
}
func (t *Token) IsValid() bool {
return t.token.Valid
}
func main() {
http.HandleFunc("/", func(rw http.ResponseWriter, rq *http.Request) {
var t *Token
t = New()
t.Set("blah", "blohh")
err := t.WriteHeader(rw)
if err != nil {
log.Println("error generate token:", err)
}
})
http.HandleFunc("/validate", func(rw http.ResponseWriter, rq *http.Request) {
token, err := ParseFromReq(rq)
if err != nil {
log.Println(err)
return
}
if token.IsValid() {
rw.Write([]byte("valid"))
return
}
rw.Write([]byte("invalid"))
})
http.ListenAndServe(":8080", nil)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment