Я работаю над 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",
}
}