aboutsummaryrefslogtreecommitdiff
path: root/weed/security/jwt.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2016-06-02 18:09:14 -0700
committerChris Lu <chris.lu@gmail.com>2016-06-02 18:09:14 -0700
commit5ce6bbf07672bf3f3c8d26cd2ce0e3e853a47c44 (patch)
tree2e4dd2ad0a618ab2b7cdebcdb9c503526c31e2e8 /weed/security/jwt.go
parentcaeffa3998adc060fa66c4cd77af971ff2d26c57 (diff)
downloadseaweedfs-5ce6bbf07672bf3f3c8d26cd2ce0e3e853a47c44.tar.xz
seaweedfs-5ce6bbf07672bf3f3c8d26cd2ce0e3e853a47c44.zip
directory structure change to work with glide
glide has its own requirements. My previous workaround caused me some code checkin errors. Need to fix this.
Diffstat (limited to 'weed/security/jwt.go')
-rw-r--r--weed/security/jwt.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/weed/security/jwt.go b/weed/security/jwt.go
new file mode 100644
index 000000000..a2472ca6e
--- /dev/null
+++ b/weed/security/jwt.go
@@ -0,0 +1,72 @@
+package security
+
+import (
+ "net/http"
+ "strings"
+
+ "time"
+
+ "github.com/chrislusf/seaweedfs/weed/glog"
+ jwt "github.com/dgrijalva/jwt-go"
+)
+
+type EncodedJwt string
+type Secret string
+
+func GenJwt(secret Secret, fileId string) EncodedJwt {
+ if secret == "" {
+ return ""
+ }
+
+ t := jwt.New(jwt.GetSigningMethod("HS256"))
+ t.Claims["exp"] = time.Now().Unix() + 10
+ t.Claims["sub"] = fileId
+ encoded, e := t.SignedString(secret)
+ if e != nil {
+ glog.V(0).Infof("Failed to sign claims: %v", t.Claims)
+ return ""
+ }
+ return EncodedJwt(encoded)
+}
+
+func GetJwt(r *http.Request) EncodedJwt {
+
+ // Get token from query params
+ tokenStr := r.URL.Query().Get("jwt")
+
+ // Get token from authorization header
+ if tokenStr == "" {
+ bearer := r.Header.Get("Authorization")
+ if len(bearer) > 7 && strings.ToUpper(bearer[0:6]) == "BEARER" {
+ tokenStr = bearer[7:]
+ }
+ }
+
+ // Get token from cookie
+ if tokenStr == "" {
+ cookie, err := r.Cookie("jwt")
+ if err == nil {
+ tokenStr = cookie.Value
+ }
+ }
+
+ return EncodedJwt(tokenStr)
+}
+
+func EncodeJwt(secret Secret, claims map[string]interface{}) (EncodedJwt, error) {
+ if secret == "" {
+ return "", nil
+ }
+
+ t := jwt.New(jwt.GetSigningMethod("HS256"))
+ t.Claims = claims
+ encoded, e := t.SignedString(secret)
+ return EncodedJwt(encoded), e
+}
+
+func DecodeJwt(secret Secret, tokenString EncodedJwt) (token *jwt.Token, err error) {
+ // check exp, nbf
+ return jwt.Parse(string(tokenString), func(token *jwt.Token) (interface{}, error) {
+ return secret, nil
+ })
+}