如何提取和验证从前端发送的令牌
How to extract and verify token sent from frontend
我正在使用“github.com/dgrijalva/jwt-go”,并且能够向我的前端发送令牌,我想知道如何检索从前端发送的令牌,所以我可以验证发送的令牌是否有效,如果有效,安全资源将被传送。
这是从前端发送的令牌 JavaScript:
headers: {
'Authorization':'Bearer' + localStorage.getItem('id_token')
}
这是发送令牌的代码
token := jwt.New(jwt.GetSigningMethod("HS256"))
claims := make(jwt.MapClaims)
claims["userName"] = loginRequest.UserName
claims["exp"] = time.Now().Add(time.Minute * 60).Unix()
token.Claims = claims
tokenString, err := token.SignedString([]byte(SecretKey))
tokenByte, err := json.Marshal(data)
w.WriteHeader(201)
w.Write(tokenByte)
这是验证令牌的代码
func VerifyToken(r *http.Request) bool {
reqToken := r.Header.Get("Authorization")
token, err := jwt.Parse(reqToken, func(t *jwt.Token) (interface{}, error) {
return []byte(SecretKey), nil
})
if err == nil && token.Valid {
fmt.Println("valid token")
return true
} else {
fmt.Println("invalid token")
return false
}
}
我正在获取 nil 令牌作为 return,我猜我已经发送了不记名,我认为如果是的话可能需要解析如何?
服务器需要一个没有添加字符串的令牌字符串,在我的例子中,我在 header 中的令牌字符串中添加了 Bearer 字符串,当向 Web 服务器发送请求时,即
'Authorization':'Bearer ' + localStorage.getItem('id_token')
在网络服务器上,我们只需要拆分没有 Bearer 字符串的有效令牌
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer ")
reqToken = splitToken[1]
因此它成为没有 nil 的有效令牌。
上面的答案有点不正确,因为拆分reqToken
后,splitToken
中应该只有一个值,即令牌本身。
假设令牌格式如下:
'Authorization': 'Bearer <YOUR_TOKEN_HERE>'
这是标准格式 - 在字符串 "Bearer" 和实际令牌本身之间有一个 space。
以下代码将执行正确的令牌提取:
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
if len(splitToken) != 2 {
// Error: Bearer token not in proper format
}
reqToken = strings.TrimSpace(splitToken[1])
fmt.Println(reqToken) // <YOUR_TOKEN_HERE>
来源:https://github.com/harlow/authtoken/blob/master/authtoken.go
const BEARER_SCHEMA = "Bearer "
authHeader := req.Header.Get("Authorization")
token := authHeader[len(BEARER_SCHEMA):]
1)这里有函数profilehandler(作者theShivaa);
链接 1:https://gist.github.com/theShivaa/999cec98fc29d77ea47b2bdaf0a6b4fb
链接2:https://medium.com/@theShiva5/creating-simple-login-api-using-go-and-mongodb-9b3c1c775d2f
2)为了use/test这个功能,在bashshell我运行这个命令。
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmaXJzdG5hbWUiOiJwaXBwbzIiLCJsYXN0bmFtZSI6InBpcHBvMyIsInVzZXJuYW1lIjoicGlwcG8xZiJ9.MkcI4JNUgoOeMzJUhDe4dLOsK3zXSAGC9fCV5EqwA98" -X GET http: //本地主机:8080/配置文件
if fmt.Sprintf("Bearer %s", pkg.FetchEnv("API_KEY")) == req.Header.Get("Authorization") {
//OK
}
我正在使用“github.com/dgrijalva/jwt-go”,并且能够向我的前端发送令牌,我想知道如何检索从前端发送的令牌,所以我可以验证发送的令牌是否有效,如果有效,安全资源将被传送。
这是从前端发送的令牌 JavaScript:
headers: {
'Authorization':'Bearer' + localStorage.getItem('id_token')
}
这是发送令牌的代码
token := jwt.New(jwt.GetSigningMethod("HS256"))
claims := make(jwt.MapClaims)
claims["userName"] = loginRequest.UserName
claims["exp"] = time.Now().Add(time.Minute * 60).Unix()
token.Claims = claims
tokenString, err := token.SignedString([]byte(SecretKey))
tokenByte, err := json.Marshal(data)
w.WriteHeader(201)
w.Write(tokenByte)
这是验证令牌的代码
func VerifyToken(r *http.Request) bool {
reqToken := r.Header.Get("Authorization")
token, err := jwt.Parse(reqToken, func(t *jwt.Token) (interface{}, error) {
return []byte(SecretKey), nil
})
if err == nil && token.Valid {
fmt.Println("valid token")
return true
} else {
fmt.Println("invalid token")
return false
}
}
我正在获取 nil 令牌作为 return,我猜我已经发送了不记名,我认为如果是的话可能需要解析如何?
服务器需要一个没有添加字符串的令牌字符串,在我的例子中,我在 header 中的令牌字符串中添加了 Bearer 字符串,当向 Web 服务器发送请求时,即
'Authorization':'Bearer ' + localStorage.getItem('id_token')
在网络服务器上,我们只需要拆分没有 Bearer 字符串的有效令牌
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer ")
reqToken = splitToken[1]
因此它成为没有 nil 的有效令牌。
上面的答案有点不正确,因为拆分reqToken
后,splitToken
中应该只有一个值,即令牌本身。
假设令牌格式如下:
'Authorization': 'Bearer <YOUR_TOKEN_HERE>'
这是标准格式 - 在字符串 "Bearer" 和实际令牌本身之间有一个 space。
以下代码将执行正确的令牌提取:
reqToken := r.Header.Get("Authorization")
splitToken := strings.Split(reqToken, "Bearer")
if len(splitToken) != 2 {
// Error: Bearer token not in proper format
}
reqToken = strings.TrimSpace(splitToken[1])
fmt.Println(reqToken) // <YOUR_TOKEN_HERE>
来源:https://github.com/harlow/authtoken/blob/master/authtoken.go
const BEARER_SCHEMA = "Bearer "
authHeader := req.Header.Get("Authorization")
token := authHeader[len(BEARER_SCHEMA):]
1)这里有函数profilehandler(作者theShivaa);
链接 1:https://gist.github.com/theShivaa/999cec98fc29d77ea47b2bdaf0a6b4fb
链接2:https://medium.com/@theShiva5/creating-simple-login-api-using-go-and-mongodb-9b3c1c775d2f
2)为了use/test这个功能,在bashshell我运行这个命令。
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmaXJzdG5hbWUiOiJwaXBwbzIiLCJsYXN0bmFtZSI6InBpcHBvMyIsInVzZXJuYW1lIjoicGlwcG8xZiJ9.MkcI4JNUgoOeMzJUhDe4dLOsK3zXSAGC9fCV5EqwA98" -X GET http: //本地主机:8080/配置文件
if fmt.Sprintf("Bearer %s", pkg.FetchEnv("API_KEY")) == req.Header.Get("Authorization") {
//OK
}