JWT не проверяет полученный токен - PullRequest
0 голосов
/ 29 января 2020

У меня есть конечная точка регистратора и конечная точка входа в систему, которая отвечает JWT

Но при получении этого JWT этот процесс выдает INVALID TOKEN

func ValidarToken(w http.ResponseWriter, r *http.Request) bool {

token, err := request.ParseFromRequestWithClaims(r, request.OAuth2Extractor, &models.Claim{}, func(token *jwt.Token) (interface{}, error){
        return VerifyKey, nil
})

if err != nil {
    switch err.(type) {
    case *jwt.ValidationError:
            vErr := err.(*jwt.ValidationError)
            switch vErr.Errors {
                case jwt.ValidationErrorExpired:
                    http.Error(w, "Su token ha expirado "+err.Error(),http.StatusUnauthorized)
                case jwt.ValidationErrorSignatureInvalid:
                    http.Error(w, "La firma del token no coincide "+err.Error(),http.StatusUnauthorized)
                default:
                    http.Error(w, "Su token no es válido "+err.Error(),http.StatusUnauthorized)
            }
    default:
        http.Error(w, "Su token no es válido "+err.Error(),http.StatusUnauthorized)
    }
    return false
}

Postman

Я прочитал много документации, но я не могу понять, почему тот же токен, который я генерирую, не распознается тем же приложением

Спасибо

Обновлено :

Это мой код Generate JWT

func GeneroJWT(t models.Usuario) (string, error) {

    leoClaves()

    payload := jwt.MapClaims{
           "email": t.Email,
           "nombre": t.Nombre,
           "apellidos": t.Apellidos,
           "fecha_nacimiento": t.FechaNacimiento,
           "biografia": t.Biografia,
           "ubicacion": t.Ubicacion,
           "sitioweb": t.SitioWeb,
           "exp": time.Now().Add(time.Hour * 24).Unix(),
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)

    tokenStr, err := token.SignedString(SignKey)

    if err != nil {
        return tokenStr, err
    }
    return tokenStr,nil
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

В этом случае проблема (согласно комментариям) заключалась в том, что маркер HS256 создавался с использованием сертификата RSA в качестве секрета. Алгоритм HSA256 является симметричным c (см. этот вопрос для получения дополнительной информации), поэтому для его декодирования необходимо передать тот же секретный ключ, который использовался для создания токена (в этом случае сертификат передается в качестве ключа, но библиотека рассматривала его как байт [], а не как обработку сертификата).

Если вы хотите использовать асимметричное c шифрование (шифрование с помощью закрытого ключа; проверка с помощью ключа publi c), то следует использовать другой алгоритм (например, RS256). Пример .

0 голосов
/ 29 января 2020

Я подписываю JWT в Go с помощью этой библиотеки: github.com / dgrijalva / jwt- go, и я проверяю это так:

		reqToken := r.Header.Get("Authorization")

		splitToken := strings.Split(reqToken, "Bearer")
		if len(splitToken) != 2 {
			w.WriteHeader(http.StatusUnauthorized)
			fmt.Fprintln(w, "No se ha proporcionado el token")
			return
		}

		reqToken = strings.TrimSpace(splitToken[1])

		claims := &Claims{}

		tkn, err := jwt.ParseWithClaims(reqToken, claims, func(token *jwt.Token) (interface{}, error) {
			return jwtKey, nil
		})

		if err != nil {
			if err == jwt.ErrSignatureInvalid {
				w.WriteHeader(http.StatusUnauthorized)
				fmt.Fprintln(w, "No autenticado")
				return
			}
			w.WriteHeader(http.StatusBadRequest)
			fmt.Fprintln(w, "No autenticado")
			return
		}
		if !tkn.Valid {
			w.WriteHeader(http.StatusUnauthorized)
			return
		}

		next.ServeHTTP(w, r)

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...