使用 JWT,如何检查 Authorization-Header?
Working with JWT, how to check for Authorization-Header?
我对使用 JWT 完全陌生,我在某个时候遇到了困难:
对于 AJAX 请求,我可以在请求之前设置 authorization-header...好的。
如何将 JWT 用于 "normal" 请求? F.e。重新加载页面或仅关注 link.
时
F.e。如果用户未登录,我想将他重定向到 landing-page.
在 server-side 上,我有中间件从 authorization-header 检查 JWT,然后授予权限或重定向到 landing-page,但目前我总是得到landing-page,因为 non-AJAX 个请求没有 authorization-header。
我将 JWT 存储在本地存储中。
我错过了什么?
此致
只是普通请求不能设置,因为它是应用层认证,只能在JS中处理。您应该提供不需要身份验证的端点并为页面提供服务,然后在 JS 中您应该检查是否有存储的 JWT 并采取相应措施(转到登录页面或加载应用程序)。
这在很大程度上取决于您的 JS 前端框架。
查看 JSON Web 令牌 RFC https://www.rfc-editor.org/rfc/rfc7519
JSON Web Token (JWT) is a compact claims representation format intended for space constrained environments such as HTTP Authorization headers and URI query parameters
没有义务使用 header。您可以将 JWT 作为 URL 中的查询参数或 POST 表单中的字段发送。
对于链接,只需将 JWT 作为参数包含在内url?JWT=...
在您的服务器中您必须处理所有接收 JWT 的方式
您可以将 JWT 存储在 Cookie 中。这样,它们将随每个请求一起发送(包括 "normal" 个)。这是我的一个项目的代码片段:
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
我对使用 JWT 完全陌生,我在某个时候遇到了困难:
对于 AJAX 请求,我可以在请求之前设置 authorization-header...好的。
如何将 JWT 用于 "normal" 请求? F.e。重新加载页面或仅关注 link.
时F.e。如果用户未登录,我想将他重定向到 landing-page.
在 server-side 上,我有中间件从 authorization-header 检查 JWT,然后授予权限或重定向到 landing-page,但目前我总是得到landing-page,因为 non-AJAX 个请求没有 authorization-header。
我将 JWT 存储在本地存储中。
我错过了什么?
此致
只是普通请求不能设置,因为它是应用层认证,只能在JS中处理。您应该提供不需要身份验证的端点并为页面提供服务,然后在 JS 中您应该检查是否有存储的 JWT 并采取相应措施(转到登录页面或加载应用程序)。 这在很大程度上取决于您的 JS 前端框架。
查看 JSON Web 令牌 RFC https://www.rfc-editor.org/rfc/rfc7519
JSON Web Token (JWT) is a compact claims representation format intended for space constrained environments such as HTTP Authorization headers and URI query parameters
没有义务使用 header。您可以将 JWT 作为 URL 中的查询参数或 POST 表单中的字段发送。
对于链接,只需将 JWT 作为参数包含在内url?JWT=...
在您的服务器中您必须处理所有接收 JWT 的方式
您可以将 JWT 存储在 Cookie 中。这样,它们将随每个请求一起发送(包括 "normal" 个)。这是我的一个项目的代码片段:
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