2016-09-12 14 views
1

私はGoでJson Webトークン認証システムを作ろうとしていますが、Webトークンの解析を行うようです。 このエラーは次の機能で発生します。Goの無効なJson Webトークン

func RequireTokenAuthentication(rw http.ResponseWriter, req *http.Request, next http.HandlerFunc) { 
authBackend := InitJWTAuthenticationBackend() 

jwtString := req.Header.Get("Authorization") 


token, err := jwt.Parse(jwtString, func(token *jwt.Token) (interface{}, error) { 
    if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { 
     log.Println("Unexpected signing method") 
     return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) 
    } else { 
     log.Println("The token has been successfully returned") 
     return authBackend.PublicKey, nil 
    } 
}) 

log.Println(token) 
log.Println(token.Valid) 

if err == nil && token.Valid && !authBackend.IsInBlacklist(req.Header.Get("Authorization")) { 
    next(rw, req) 
} else { 
    rw.WriteHeader(http.StatusUnauthorized) 
    log.P 

rintln("Status unauthorized RequireTokenAuthentication") 
    } 
} 

私もBearer

curl -H "Authorization:eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzM5NzQ4OTAsImlhdCI6MTQ3MzcxNTY5MCwic3ViIjoiIn0.mnwEwdR8nuvdLo_4Ie43me7iph2LeSj1uikokgD6VJB7isjFPShN8E7eQr4GKwuIiLTi34_i6iJRpmx9qrPugkzvsoxX44qlFi6M7FDhVySRiYbBQwTCvKCpvhnsK8BHJyEgy813aaxOMK6sKZJoaKs5JYUvnNZdNqmENYj1BM6FdbGP-oLHuR_CJK0Pym1NMhv9zLI1rpJOGu4mfj1t4tHYZAEGirPnzYMamtrK6TyEFE6Xi4voEEadq7hXvWREg6wNSQsYgww8uOaIWLy1yLbhTkPmT8zfRwLLYLqS_UuZ0xIaSWO1mF2plvOzz1WlF3ZEHLS31T1egB1XL4WTNQe" http://localhost:5000/test/hello 
ずにカールしようとした次のログ

[negroni] Started GET /test/hello 
2016/09/13 01:34:46 &{Bearer eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzM5NzQ4OTAsImlhdCI6MTQ3MzcxNTY5MCwic3ViIjoiIn0.mnwEwdR8nuvdLo_4Ie43me7iph2LeSj1uikokgD6VJB7isjFPShN8E7eQr4GKwuIiLTi34_i6iJRpmx9qrPugkzvsoxX44qlFi6M7FDhVySRiYbBQwTCvKCpvhnsK8BHJyEgy813aaxOMK6sKZJoaKs5JYUvnNZdNqmENYj1BM6FdbGP-oLHuR_CJK0Pym1NMhv9zLI1rpJOGu4mfj1t4tHYZAEGirPnzYMamtrK6TyEFE6Xi4voEEadq7hXvWREg6wNSQsYgww8uOaIWLy1yLbhTkPmT8zfRwLLYLqS_UuZ0xIaSWO1mF2plvOzz1WlF3ZEHLS31T1egB1XL4WTNQe <nil> map[] <nil> false} 
2016/09/13 01:34:46 false 
2016/09/13 01:34:46 Status unauthorized RequireTokenAuthentication 
[negroni] Completed 401 Unauthorized in 71.628ms 

、ここでは、私はそれを

curl -H "Authorization: Bearer eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzM5NzQ4OTAsImlhdCI6MTQ3MzcxNTY5MCwic3ViIjoiIn0.mnwEwdR8nuvdLo_4Ie43me7iph2LeSj1uikokgD6VJB7isjFPShN8E7eQr4GKwuIiLTi34_i6iJRpmx9qrPugkzvsoxX44qlFi6M7FDhVySRiYbBQwTCvKCpvhnsK8BHJyEgy813aaxOMK6sKZJoaKs5JYUvnNZdNqmENYj1BM6FdbGP-oLHuR_CJK0Pym1NMhv9zLI1rpJOGu4mfj1t4tHYZAEGirPnzYMamtrK6TyEFE6Xi4voEEadq7hXvWREg6wNSQsYgww8uOaIWLy1yLbhTkPmT8zfRwLLYLqS_UuZ0xIaSWO1mF2plvOzz1WlF3ZEHLS31T1egB1XL4WTNQe" http://localhost:5000/test/hello 

を開始するために使用していますcURLのです返します

トークンが無効であるため、エラーが発生していますtoken.Valid = false次のプロセスを使用してトークンを生成しました。ここで

はここでルータ

router.HandleFunc("/token-auth", controllers.Login).Methods("POST") 

でログインコントローラ

func Login(w http.ResponseWriter, r *http.Request) { 
    requestUser := new(models.User) 
    decoder := json.NewDecoder(r.Body) 
    decoder.Decode(&requestUser)  
    responseStatus, token := utils.Login(requestUser) //here the util file seen below is used 
    w.Header().Set("Content-Type", "application/json") 
    w.WriteHeader(responseStatus) 
    w.Write(token) 

} 

これは

func Login(requestUser *models.User) (int, []byte) { 
     authBackend := authentication.InitJWTAuthenticationBackend() 

     if authBackend.Authenticate(requestUser) { 
      token, err := authBackend.GenerateToken(requestUser.UUID) 
      if err != nil { 
       return http.StatusInternalServerError, []byte("") 
      } else { 
       response, _ := json.Marshal(parameters.TokenAuthentication{token}) 
       return http.StatusOK, response 
      } 
     } 
     return http.StatusUnauthorized, []byte("") 
    } 

utilのファイルであり、ここでトークンを生成するために使用される方法である

func (backend *JWTAuthenticationBackend) GenerateToken(userUUID string) (string, error) { 
    token := jwt.New(jwt.SigningMethodRS512) 

    claims := token.Claims.(jwt.MapClaims) 

    claims["exp"] = time.Now().Add(time.Hour * time.Duration(settings.Get().JWTExpirationDelta)).Unix() 
    claims["iat"] = time.Now().Unix() 
    claims["sub"] = userUUID 

    tokenString, err := token.SignedString(backend.privateKey) 
    if err != nil { 
     panic(err) 
     return "", err 
    } 

    return tokenString, nil 
} 

トークンが有効になるようにトークン解析システムを修正するにはどうすればよいですか? 追加情報が必要な場合は、それぞれの情報を編集して嬉しいです。 は、あなたが "ベアラー" を削除した場合jwt.Parse()によって返されたエラーはそう

tokenstring should not contain 'bearer '

を言う

答えて

1

をありがとう:あなたは

The token has been successfully returned

ビット更を取得

jwtString = strings.Split(jwtString, "Bearer ")[1] 

は、しかし、今があります新しいエラー:

key is of invalid type

申し訳ありませんが、完全な回答ではありません。

+0

このエラーの原因を指摘する情報はありますか? –

+0

鍵をどのように作成しているか説明できますか? –

+0

トークンを生成するために使用したプロセスを追加しました。ありがとう! –

関連する問題