beego应用做纯API后端如何使用jwt实现无状态权限验证

jwt是什么,可以百度下其它文章,我原来看到一个讲的详细的,现在找不到了。先简单介绍下我个人的理解,就是一个token,只不过通过加密解密的手段,能让这一串字符带有一些简单的信息。这样解密jwt后不用查数据库,最常用的例子,保存用户权限,再多层的权限,其实只用一个数字,转换成二进制,每一位代表一种权限。类似这样的使用,还有保存session的key,通过该值查session就能获取更丰富的资料,用来保存用户状态也是可以的。

下面介绍下我的一个golang项目中使用beego框架做纯API接口使用jwt的方法。

首先用到jwt函数的go文件都要引入这个库

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

登录函数中登录成功把jwt字符串发给客户端,客户端需要保存起来比如localStorage中,访问别的API时加到header里面, 注意这个里面exp是必须要的,生命周期。其他都是根据自己需求添加的键值对。。

if passwd == user.Password {

            // 带权限创建令牌
            claims := make(jwt.MapClaims)
            claims["username"] = username
            if username == "admin" {
                claims["admin"] = "true"
            } else {
                claims["admin"] = "false"
            }
            claims["exp"] = time.Now().Add(time.Hour * 480).Unix() //20天有效期,过期需要重新登录获取token
            token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

            // 使用自定义字符串加密 and get the complete encoded token as a string
            tokenString, err := token.SignedString([]byte("mykey"))
            if err != nil {
                beego.Error("jwt.SignedString:", err)
                this.RetError(errSystem)
                return
            }
            this.Data["json"] = map[string]interface{}{"status": 200, "message": "login success ", "moreinfo": tokenString}
        } else {
            this.Data["json"] = map[string]interface{}{"status": 400, "message": "login failed ", "moreinfo": time.Now().Format("2006-01-02 15:04:05")}
        }


baseControler写这个函数,别的函数全部调用这个做权限认证

// ParseToken parse JWT token in http header.
func (c *BaseController) ParseToken() (t *jwt.Token, e *ControllerError) {
    authString := c.Ctx.Input.Header("Authorization")
    beego.Debug("AuthString:", authString)

    kv := strings.Split(authString, " ")
    if len(kv) != 2 || kv[0] != "Bearer" {
        beego.Error("AuthString invalid:", authString)
        return nil, errInputData
    }
    tokenString := kv[1]

    // Parse token
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        return []byte("mykey"), nil
    })
    if err != nil {
        beego.Error("Parse token:", err)
        if ve, ok := err.(*jwt.ValidationError); ok {
            if ve.Errors&jwt.ValidationErrorMalformed != 0 {
                // That‘s not even a token
                return nil, errInputData
            } else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
                // Token is either expired or not active yet
                return nil, errExpired
            } else {
                // Couldn‘t handle this token
                return nil, errInputData
            }
        } else {
            // Couldn‘t handle this token
            return nil, errInputData
        }
    }
    if !token.Valid {
        beego.Error("Token invalid:", tokenString)
        return nil, errInputData
    }
    beego.Debug("Token:", token)

    return token, nil
}
其他API代码片段
token, e := this.ParseToken()
    if e != nil {
        this.RetError(e)
        return
    }
    claims, ok := token.Claims.(jwt.MapClaims)
    if !ok {
        this.RetError(errPermission)
        return
    }
var user string = claims["username"].(string)

时间: 2024-10-26 16:32:20

beego应用做纯API后端如何使用jwt实现无状态权限验证的相关文章

从壹开始前后端分离[.netCore 不定期 ] 36 ║解决JWT权限验证过期问题

缘起 哈喽,老张的不定期更新的日常又开始了,在咱们的前后端分离的.net core 框架中,虽然已经实现了权限验证<框架之五 || Swagger的使用 3.3 JWT权限验证[修改]>,只不过还是有一些遗留问题,最近有不少的小伙伴发现了这样的一些问题,本来想着直接就在原文修改,但是发现可能怕有的小伙伴看不到,就单发一条推送吧,所以我还是单写出一篇文章来说明解决这些问题,希望对无论是正在开发权限管理系统,还是平时需要数据库动态绑定权限分配的你有一些启发和思考.今天咱们注意解决这三个问题: 1.

前后端分离之JWT用户认证

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了.于是我们的程序就不知道谁是谁,就要再验证一次.所以为了保证系统安全,我们就需要验证用户否处于登录状态. 传统方式 前后端分离通过Restful API进行数据交互时,如何验证用户的登录信息及权限.在原来的项目中,使用的是最传统也是最简单的方式,前端登录,后端根据用户信息生成一个token,并保存这个 to

在.Net MVC结构API接口中判断http头信息实现公共的权限验证过滤器示例

//control   action public class TestController : ApiController { [MyAuthFilter] public string test(string str) { return str.Trim(); } } //过虑器类 public class MyAuthFilter : ActionFilterAttribute { const string SecurityKeyName = "MySecurityKey";//h

Shiro权限验证代码记录,正确找到shiro框架在什么地方做了权限识别

权限验证方式的验证代码: org.apache.shiro.web.servlet.AdviceFilter这个类是所有shiro框架提供的默认权限验证实例类的父类 验证代码: public void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { Exception exception = nu

ASP.NET MVC View 和 Web API 的基本权限验证

ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Microsoft Visual Studio 2013(MVC 5 + Web API 2) 修改Web.config,增加Forms验证模式,在system.web节点中增加以下配置: <authentication mode="Forms"> <forms loginU

asp.net web api 权限验证的方法

思路:客户端使用header或者form讲验证信息传入api,在权限验证过滤中进行处理,代码示例: 定义过滤器 public class ApiFilter1 : System.Web.Http.AuthorizeAttribute { protected override bool IsAuthorized(HttpActionContext actionContext) { var content = actionContext.Request.Properties["MS_HttpCont

基于beego一键创建restful api

借鉴自这里 restful协议可以参考如下,当然最好的,看rails的rake routes,那个最标准了 URL HTTP Verb Functionality /object POST Creating Objects /object/objectId GET Retrieving Objects /object/objectId PUT Updating Objects /object GET Queries /object/objectId DELETE Deleting Objects

nginx做前端,后端web服务器无法获取真正客户机的ip,解决方法

由于,前端使用了nginx作为代理服务器,代理后端的web服务器和tomcat服务器,发现后端服务器的访问日志记录的客户端ip是nginx反代机器的ip,,所以,以下方法可以让后端服务器获取到真正的客户机ip. 首先在前端nginx服务器的server{  } 里添加: proxy_set_header        Host            $host; proxy_set_header        X-Real-IP       $remote_addr; proxy_set_hea

用border做纯CSS的三角形

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> body{margin:0;padding: 0;} div{margin:10px;} .b0{height:100px; width:100px; border-top:solid 50px red; bor