. $ ajax () метод GET конечная точка api GOLANG JWT Ответ на предпечатную проверку имеет недопустимый код состояния HTTP 401 - PullRequest
0 голосов
/ 01 июня 2018

Я работаю над Golang API, основанным на Gin Framework, этот API имеет метод аутентификации, использующий jwt (веб-токены json)

У меня есть клиентский интерфейс, который написан на javascript (ajax,jquery)

я должен сделать login with a POST method, он генерирует меня the token на основе электронной почты и пароля от входов в переднем конце,

Это прекрасно работает в postman свойдите в систему и перейдите к hello endpoints(private endpoints), но в браузере выдает ошибку.

Ошибка: Response for preflight has invalid HTTP status code 401

Эта ошибка получена только избраузер (Chrome), но он работает на Почтальоне

Я исправил проблему для CORS , добавив расширение в браузер, но он не работает из-за ошибки

Не могли бы вы помочь здесь ??Спасибо действительно за любую помощь или предложения.

Вот клиентская сторона:

<html>
<link rel="stylesheet" href="test.css">
<body>
    <form id ="form"  method="POST">
        <p>Email:</p><br>
        <input type="text" id="email" placeholder="body" /><br>
        <p>Password:</p><br>
        <input type="text" id="password" placeholder="body" />
        <br>
        <input  type="submit" value="Submit">
    </form>

    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script type="text/javascript">
    var username;
    var password;

    $("#form").submit(function(e) {
        var url = "http://localhost:1234/login"; 
        var url1= "http://localhost:1234/v1/hello";
        var data;// the script where you handle the form input.
        var jwttoken;
        username=$('#username').val();
        password=$('#password').val();

        $.ajax({
            type: "POST",
            url: url,
            data: JSON.stringify({ 
                // Those property names must match the property names of your PromotionDecision  view model
                username:username,
                password: password}),
                success: function(data)
                {

                    console.log(data); 
                    window.localStorage.setItem('token', data.token);
                    console.log(window.localStorage.getItem('token'));

                    $.ajax({
                        type: "GET",
                        beforeSend: function (request)
                        {
                            request.withCredentials = true;
                            request.setRequestHeader("Authorization", "Bearer " +  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1Mjc4NTcyOTEsImlkIjoiZWxtZWhkaS5hYXJhYkBzY2hpYnN0ZWQuY29tIiwib3JpZ19pYXQiOjE1Mjc4NTM2OTEsInJvbGUiOiJhZG1pbiJ9.wS3trHKUChsU-OmSo6tDUPPuzVriJF7z9i0_8W_36nY");
                        },
                        url: url1,
                        success: function(datad)
                        {
                            console.log(datad); 
                        }
                    });
                }
        });
        e.preventDefault(); // avoid to execute the actual submit of the form.
    });
    </script>
</body>
</html>

Вот API GOLANG (Gin framework) с использованием JWT:

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    jwt "gopkg.in/appleboy/gin-jwt.v2"
    "net/http"
    "time"
)

func main() {
    router := gin.Default()

    jwtMiddleware := &jwt.GinJWTMiddleware{
        Realm: "user.io",

        Key:           []byte("changeme"),
        Timeout:       time.Hour,
        MaxRefresh:    time.Hour,
        Authenticator: authenticate,

        PayloadFunc: payload,
    }

    router.POST("/login", jwtMiddleware.LoginHandler)
    router.OPTIONS("/login", jwtMiddleware.LoginHandler)

    v1 := router.Group("/v1")

    v1.Use(jwtMiddleware.MiddlewareFunc())
    {
        v1.GET("/hello", hello)
        v1.OPTIONS("/hello", hello)

    }
    router.Run(":1234")
}

func hello(c *gin.Context) {
    fmt.Println("hello", c.Request.Header["Authorization"])

    claims := jwt.ExtractClaims(c)
    c.String(http.StatusOK, "id: %s\nrole: %s\n", claims["id"], claims["role"])
}

func authenticate(email string, password string, c *gin.Context) (string, bool) {
    if email == "mike@gmail.com" && password == "med" {
        return email, true
    }
    return "", false
}

func payload(email string) map[string]interface{} {
    return map[string]interface{}{
        "id":   "1349",
        "role": "admin",
    }
}
...