Используя токены 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
, как показано выше.
Если этот вопрос является базовым для Голанга, то извините. Спасибо.