【问题标题】:Golang and JWT - Simple LogoutGolang 和 JWT - 简单的注销
【发布时间】:2016-07-17 12:23:18
【问题描述】:

我目前正在开发一个 API,经过一段时间后,我现在了解了如何在 Go 中使用 JWT 来获取令牌。使用此令牌,我可以保持用户连接,但是如何从客户端应用程序中注销?

这是我的token.go 代码:

package main

import (
    "github.com/dgrijalva/jwt-go"
    "time"
)

const (
    tokenEncodeString = "something"
)

func createToken(user User) (string, error) {
    // create the token                                                                                                                                                                                  
    token := jwt.New(jwt.SigningMethodHS256)

    // set some claims                                                                                                                                                                                   
    token.Claims["username"] = user.Username;
    token.Claims["password"] = user.Password;
    token.Claims["exp"] = time.Now().Add(time.Hour * 72).Unix()

    //Sign and get the complete encoded token as string                                                                                                                                                  
    return (token.SignedString([]byte(tokenEncodeString)))
}

func parseToken(unparsedToken string) (bool, string) {
    token, err := jwt.Parse(unparsedToken, func(token *jwt.Token) (interface{}, error) {
            return []byte(tokenEncodeString), nil
    })

    if err == nil && token.Valid {
            return true, unparsedToken
    } else {
            return false, ""
    }
}

经过研究,我发现我可以使用黑名单,但我真的很想知道是否可以使用更简单的方法,比如上面的代码。

我还想找到一个适用于 JWT 进程使用的内存的解决方案。一直断开/连接自己的人每次会话必须只有一个令牌,而不是给他一个,并且在给定的黑名单中有一百个。

【问题讨论】:

  • JWT 注销通常在客户端完成。发行“空”令牌也可以起到同样的作用。
  • 有几件事,将密码存储在 jwt 令牌中是一个非常糟糕的主意,尽管它们已签名,但仍然可以轻松地进行 base64 解码。对于问题的其余部分,通常这是相当容易解决的问题,当您想要使令牌无效时,您可以在服务器端过期的会话 ID。
  • 好的,我会改的,谢谢你的留言;)

标签: go jwt token logout jwt-go


【解决方案1】:

首先:不要(永远)将敏感凭据放入令牌中。它们没有加密,您不需要这样做。

注意:

  • JWT 是无状态的:您发出一个,只要您在服务器上允许/正在对其进行验证,它就会一直存在。
  • 您可以签发“现在”到期的新 JWT,但旧 JWT 仍然有效(即存在安全风险)。
  • 通读http://jwt.io/introduction/

如果您需要控制颁发后过期的访问令牌,那么您应该实施一个服务器端方案,这将允许您直接使令牌过期。用户只会持有一个引用服务器端存储的 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 2015-12-31
    • 2016-04-01
    • 2018-09-23
    • 2018-07-29
    • 2018-06-16
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多