package restlet
|
|
|
|
import (
|
|
"fmt"
|
|
log "github.com/Sirupsen/logrus"
|
|
"github.com/dgrijalva/jwt-go"
|
|
"github.com/dgrijalva/jwt-go/request"
|
|
"net/http"
|
|
)
|
|
|
|
func GetSession(ctx RequestContext, secret, cookiename string, claims jwt.Claims) error {
|
|
if e := ExtractClaimsViaHeader(ctx.Request(), secret, claims); nil == e {
|
|
log.Debugln("> GetSession via Header:>", claims)
|
|
return nil
|
|
} else {
|
|
log.Debugln("> GetSession via Header failed:>", e)
|
|
}
|
|
if e := ExtractClaimsViaCookie(ctx.Request(), cookiename, secret, claims); nil == e {
|
|
log.Debugln("> GetSession via Cookie:>", claims)
|
|
return nil
|
|
} else {
|
|
log.Debugln("> GetSession via Cookie failed:>", e)
|
|
}
|
|
return fmt.Errorf("can not read session token")
|
|
}
|
|
|
|
func ExtractClaimsViaHeader(r *http.Request, secret string, o jwt.Claims) error {
|
|
if token, err := request.ParseFromRequestWithClaims(r, request.AuthorizationHeaderExtractor, o,
|
|
func(token *jwt.Token) (interface{}, error) {
|
|
return []byte(secret), nil
|
|
}); nil != err {
|
|
return err
|
|
} else if ! token.Valid {
|
|
return fmt.Errorf("token invalid")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ExtractClaimsViaCookie(r *http.Request, ckname string, secret string, o jwt.Claims) error {
|
|
for _, x := range r.Cookies() {
|
|
if x.Name == ckname {
|
|
if token, e := jwt.ParseWithClaims(x.Value, o, func(token *jwt.Token) (interface{}, error) {
|
|
return []byte(secret), nil
|
|
}); nil != e {
|
|
return e
|
|
} else if token.Valid {
|
|
return nil
|
|
}
|
|
break
|
|
}
|
|
}
|
|
return fmt.Errorf("not found")
|
|
}
|