我对与JWT合作非常陌生,我在某个方面苦苦挣扎:
使用ajax请求我可以在请求之前设置授权标头...确定。
如何将JWT用于“普通”请求? F.E.重新加载页面或只是链接。
F.e。如果用户未登录,我想将其重定向到登录页面。
在服务器端,我有中间件从授权标头检查JWT,然后授予权限或重定向到登录页面,但是目前我总是得到登陆页面,因为没有授权-header for non-ajax requests。
我将JWT存储在localstorage中。
我缺少什么?
此致
答案 0 :(得分:0)
只是您无法为正常请求设置它,因为它是一个只能在JS中处理的应用程序层身份验证。您应该提供不需要身份验证并提供页面的端点,然后在JS中,您应检查是否存储了JWT并采取相应措施(转到登录页面或加载应用程序)。 它在很大程度上取决于你的JS前端框架。
答案 1 :(得分:0)
查看JSON Web令牌RFC https://tools.ietf.org/html/rfc7519
JSON Web Token(JWT)是一种紧凑的声明表示格式,适用于空间受限的环境,如HTTP授权标头和URI查询参数
没有义务使用标题。您可以将JWT作为URL中的查询参数或POST表单中的字段发送。
对于链接,只需将JWT作为参数url?JWT=...
在您的服务器中,您必须处理接收JWT的所有方式
答案 2 :(得分:0)
您可以将JWT存储在Cookie中。通过这种方式,它们将随每个请求一起发送(包括"普通" 1)。以下是我的一个项目的代码片段:
func loginHandler(w http.ResponseWriter, r *http.Request) {
...
accessToken := newAccessToken(...) // returns a JWT with fields .Token and .Expires
cookie := &http.Cookie{
Name: "access_token",
Value: accessToken.Token,
HttpOnly: true,
Secure:true,
Expires: time.Unix(accessToken.Expires, 0),
Path: "/",
}
http.SetCookie(w, cookie)
...
}
并检索令牌:
func someHandler(w http.ResponseWriter, r *http.Request) {
cookie, err := r.Cookie("access_token")
if err != nil {
// handle missing cookie
}
accessToken := cookie.Value
...
}
请注意,Cookie容易受到CSRF攻击。
进一步阅读:Where to Store your JWTs – Cookies vs HTML5 Web Storage