Golang 和 JWT - 简单注销

标签 go jwt token logout jwt-go

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

这是我的 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 进程所用内存的解决方案。一直断开/连接自己的人必须为每个 session 只拥有一个 token ,而不是给他一个,在给定的黑名单中有一百个。

最佳答案

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

注意事项:

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

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

关于Golang 和 JWT - 简单注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36292900/

相关文章:

java - 在 Java 中读取 token

security - 哪种 JWT 刷新策略更安全?

go - 如何在 redigomock 中期望非字符串值

authentication - 如何获得智威汤逊?

json - 尝试将 unix 格式的字符串转换为 time.Time 时,使用 json.Unmarshal 给出 ParseError

java - 使用 Spring Boot 的 OAuth2 SSO,无需授权屏幕

javascript - 使用 JWT 进行身份验证

java - 如何通过nextPageToken实现分页?

algorithm - 如何确定范围列表是否涵盖给定范围?

go - 在 Golang 中无需声明结构即可从接口(interface)获取接口(interface)字段值