forked from mirror/jwt
starting to work on it
This commit is contained in:
parent
0dd5b32c62
commit
7a06ac11be
|
@ -0,0 +1,62 @@
|
||||||
|
package jwt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"errors"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A JWT Token
|
||||||
|
type Token struct {
|
||||||
|
Header map[string]interface{}
|
||||||
|
Claims map[string]interface{}
|
||||||
|
Method SigningMethod
|
||||||
|
Signature string
|
||||||
|
Valid bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func Parse(tokenString string, keyFunc func(*Token)(string, error)) (token *Token, err error) {
|
||||||
|
parts := strings.Split(tokenString, ".")
|
||||||
|
if len(parts) == 3 {
|
||||||
|
token = new(Token)
|
||||||
|
// parse Header
|
||||||
|
var headerBytes []byte
|
||||||
|
if headerBytes, err = base64.URLEncoding.DecodeString(parts[0]); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = json.Unmarshal(headerBytes, &token.Header); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse Claims
|
||||||
|
var claimBytes []byte
|
||||||
|
if claimBytes, err = base64.URLEncoding.DecodeString(parts[0]); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = json.Unmarshal(claimBytes, &token.Claims); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lookup signature method
|
||||||
|
if method, ok := token.Header["alg"].(string); ok {
|
||||||
|
if token.Method, err = GetSigningMethod(method); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = errors.New("Signing method (alg) is unspecified.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check expiry times
|
||||||
|
|
||||||
|
|
||||||
|
// Lookup key
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
err = errors.New("Token contains an invalid number of segments")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package jwt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestJWT(t *testing.T) {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package jwt
|
||||||
|
|
||||||
|
type SigningMethodRS256 struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RegisterSigningMethod("RS256", func() SigningMethod {
|
||||||
|
return new(SigningMethodRS256)
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package jwt
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
var signingMethods = map[string]func() SigningMethod{}
|
||||||
|
|
||||||
|
// Signing method
|
||||||
|
type SigningMethod interface {
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterSigningMethod(alg string, f func() SigningMethod) {
|
||||||
|
signingMethods[alg] = f
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSigningMethod(alg string)(method SigningMethod, err error) {
|
||||||
|
if methodF, ok := signingMethods[alg]; ok {
|
||||||
|
method = methodF()
|
||||||
|
} else {
|
||||||
|
err = errors.New(fmt.Sprintf("Invalid signing method (alg): %v", method))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
Loading…
Reference in New Issue