使用 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