Как записать токен в заголовок html и как его использовать? - PullRequest
0 голосов
/ 10 мая 2018

Используя токены JWT, у меня есть API на golang, с которого пользователь должен будет войти в систему, а затем получить доступ к routes. Из приведенного ниже кода, когда я попаду на страницу входа в систему, она получит доступ к ней для пользователя, но при входе пользователя в систему генерируется токен, а для промежуточного программного обеспечения мы должны взять токен из заголовка для создания сеанса, а затем, как я напишу токен в заголовке html и как я получу к нему доступ при проверке токена. Ниже приведен код: -

Маршруты: -

//routes which are available for any user
router := gin.New()
main := router.Group("/api/v2")
{
    main.GET("/signup",controller.Signup)
    main.POST("/customer/new",controller.SaveCustomer)
    main.GET("/login",controller.Users)
    main.POST("/login",controller.Login)
}
router.Use(JWTAuthMiddleware())
//routes for authorized user
v1 := router.Group("/api/v1")
//routes for v1 group for onlu authorized user

Контроллер. Функция входа

//struct
type User struct {
 Email string `json:"email"`
 Password  string    `json:"password"`
 jwt.StandardClaims
}

func Login(c *gin.Context) {
 c.Request.ParseForm()
 email := c.PostForm("email")
 password := c.PostForm("password")
 response := ResponseControllerList{}
 conditions := bson.M{"email":email,"password":password}
 data, err := models.MatchUser(conditions)
 if err!=nil {
    fmt.Println(err)
 }
 fmt.Println(data)
 dataCount, err := models.GetRecordsCount(config.CustomerCollection, conditions)
 counter:= 0
 for _, signup := range data {
    if email == signup.Email && password == signup.Password {
        //fmt.Println("heloo")
        counter = 1
    }
 }
 if data == nil {
    response = ResponseControllerList{
        config.FailureCode,
        config.FailureFlag,
        config.FailureMsg,
        config.UsernamePassword,
        nil,
    }
 } else {
    response = ResponseControllerList{
        config.SuccessFlag,
        config.SuccessFlag,
        config.SuccessMsg,
        data,
        dataCount,
    }
 }
 GetResponseList(c, response)
 if counter == 1 {
    fmt.Println("Match!")
    token := jwt.NewWithClaims(jwt.GetSigningMethod("HS256"), &User{
        Email: email,
        Password:  password,
    })
    fmt.Println(token)
    tokenstring, err := token.SignedString([]byte(""))
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(tokenstring)
    var tok models.Token
    tokenErr := json.NewDecoder(c.Request.Body).Decode(&tok)
    tok.Tok = tokenstring
    if tokenErr = nil {
        fmt.Println("error")
    }
    err = models.SaveToken(&tok)
    if err != nil {
        fmt.Println("error while saving the token")
    }else{
        fmt.Println("successfully saved")//here the token will saved 
    }
 }
}

В приведенном выше коде, когда пользователь войдет в систему, токен будет сгенерирован и сохранен в базе данных, но проблема - это то, как я запишу сгенерированный токен в заголовок html-страницы. С другой стороны, в прошлом я также использовал для этого почтальон, тогда сгенерированный токен будет показан в области заголовка на изображении.

Этот токен будет доступен в функции проверки, указанной ниже: -

func ValidateToken(c *gin.Context) {
 headerToken := c.Request.Header["Token"] 
 response := ResponseUser{}
 headerTok := strings.Join(headerToken," ")
 condition := bson.M{"token":headerTok}
 data, err := models.MatchToken(condition)// matches the token.
 if err != nil {
    fmt.Println("Errorrr")
 }
 counter:= 0
 for _, stringData := range data {
    if stringData.Tok == headerTok {
        counter = 1
    }
 }
 if counter == 1 {
    fmt.Println("Authorized user")
    c.Next()
 }else{
    fmt.Println("Unauthorized User")
    response = ResponseUser{
        "Unauthorized User",
    }
    c.AbortWithStatus(401)
    Response(c, response)
 }
}

Это ajax, которые перенаправляют меня с одной страницы на другую: -

$.ajax({
        url:"/api/v2/login",
        type:"POST",
        data: {'email':email, "password":password},
        success: function(results) {
            console.log(results)
            if(results.response.message === "Success"){
                console.log("hello")
                alert(results.response.message);
                document.location.href = "/api/v1/customer?Number="+results.response.data[0]._id;
        }
        if(results.response.message === "Failure"){
            console.log("hello")
            alert(results.response.data);
        }
    }   
});

Приведенный выше ajax перенаправит меня на эту страницу, приведенную ниже.

$(document).ready(function(){
    $('#activate').hide();
    var full_url = document.URL; // Get current url
    var url_array = full_url.split('=') // Split the string into an array with / as separator
    var UserId = url_array[url_array.length-1];  // Get the last part of the array (-1)
    $.ajax({
        url:"/api/v1/customer/get-data?Last="+UserId,
        type: "GET",
        dataType: 'json',
        async: false,
        data:{"UserId":UserId},
        success: function(response){
        //my code
        }
    });
});

headerToken := c.Request.Header["Token"] Для почтальона он возьмет токен из заголовка и сравнит его.

ВЫПУСК - это то, как я передам токен в заголовке в функции Login и как он получит доступ в функции ValidateToken, как показано выше.

Если этот вопрос является базовым для Голанга, то извините. Спасибо.

1 Ответ

0 голосов
/ 10 мая 2018

Вы должны сделать Ajax-запрос для установки настраиваемого заголовка в типичных запросах на основе браузера:

С помощью jQuery вы можете сделать это:

$(document).ready(function(){
    $('#activate').hide();
    var full_url = document.URL; // Get current url
    var url_array = full_url.split('=') // Split the string into an array with / as separator
    var UserId = url_array[url_array.length-1];  // Get the last part of the array (-1)
    $.ajax({
        url:"/api/v1/customer/get-data?Last="+UserId,
        headers: { 'Token': 'YOUR_SECRET' }, // Here your token goes!
        type: "GET",
        dataType: 'json',
        async: false,
        data:{"UserId":UserId},
        success: function(response){
        //my code
        }
    });
});

В чистом JavaScript вы можете использовать:

XMLHttpRequest.prototype.realSend = XMLHttpRequest.prototype.send;
    var newSend = function(vData) {
    this.setRequestHeader(Token, 'YOUR_SECRET');
    this.realSend(vData);
};
XMLHttpRequest.prototype.send = newSend;

Я получил это от https://stackoverflow.com/a/37435202/7338886

...