使用JWT,如何检查Authorization-Header?

时间:2016-07-22 12:45:00

标签: go header authorization jwt

我对与JWT合作非常陌生,我在某个方面苦苦挣扎:

使用ajax请求我可以在请求之前设置授权标头...确定。

如何将JWT用于“普通”请求? F.E.重新加载页面或只是链接。

F.e。如果用户未登录,我想将其重定向到登录页面。

在服务器端,我有中间件从授权标头检查JWT,然后授予权限或重定向到登录页面,但是目前我总是得到登陆页面,因为没有授权-header for non-ajax requests。

我将JWT存储在localstorage中。

我缺少什么?

此致

3 个答案:

答案 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