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 * ).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": , "message": "login success ", "moreinfo": tokenString}
} else {
this.Data["json"] = map[string]interface{}{"status": , "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) != || kv[] != "Bearer" {
beego.Error("AuthString invalid:", authString)
return nil, errInputData
}
tokenString := kv[] // 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 != {
// That's not even a token
return nil, errInputData
} else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != {
// 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)

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

  1. Spring Boot Security 整合 JWT 实现 无状态的分布式API接口

    简介 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案.JSON Web Token 入门教程 - 阮一峰,这篇文章可以帮你了解JWT的概念.本文重点讲解Spring Boo ...

  2. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  3. 基于swoole框架hyperf开发的纯API接口化的后台RBAC管理工具hyperfly@v1.0.0发布

    hyperfly@v1.0.0发布 本文地址http://yangjianyong.cn/?p=323转载无需经过作者本人授权 github地址:https://github.com/vankour/ ...

  4. 【SpringSecurity系列2】基于SpringSecurity实现前后端分离无状态Rest API的权限控制原理分析

    源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...

  5. 【SpringSecurity系列1】基于SpringSecurity实现前后端分离无状态Rest API的权限控制

    源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...

  6. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(三)-创建Data Transfer Object

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(三)-创建Data Transfer Object 版权声明:本文为博主原创文章,未经博主允许不得转载. ht ...

  7. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  8. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(一)-环境介绍

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(一)-环境介绍 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  9. 收集免费的接口服务,做一个api的搬运工

    hello, 大家好,今天给大家推荐的开源项目在某种程度上极大的方便了广大的开发者,这个开源项目统计了网上诸多的免费API,为广大开发者收集免费的接口服务,专心致志做一个API的搬运工,每月定时更新新 ...

随机推荐

  1. poj2407(欧拉函数模板)

    sqrt(n)复杂度 欧拉函数模板 #include <iostream> #include <cstdio> #include <queue> #include ...

  2. 2016.8.19上午初中部NOIP普及组比赛总结

    2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...

  3. springBoot_JPA和lombok

    一.JPA 特点:JPA可以根据方法名自动匹配sql语句. JPA是一个标准 Hibernate是JPA的一个实现,宗旨是尽量少写sql语句. 使用JPA 1.application.properti ...

  4. ubuntu挂载和挂载NTFS分区命令

    1.挂载 首先安装NTFS-3g,不过Ubuntu一般自带: sudo apt install ntfs-3g 查看分区信息: sudo fdisk -l 结果类似: /dev/sda1  *     ...

  5. SpringCloud学习笔记(三):Rest微服务构建案例工程模块

    需要具备的知识 1 springmvc+mybatis+mysql 2 Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务 3 Maven的分包分模 ...

  6. Spring MVC(七)--传递JSON参数

    有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器,为了控 ...

  7. 左神算法进阶班6_1LFU缓存实现

    [题目] LFU也是一个著名的缓存算法,自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) [题解] LFU算法与LRU算法很像 但LRU是最新使用的排在使用频率最前 ...

  8. 02_Spring Bean的装配模式_基于XML配置方式

    一.三种实例化Bean的方式 1.使用类构造器实例化(默认无参数) <bean id="bean1" class="com.demo1.Bean1"> ...

  9. 使用springboot上传文件至nginx代理服务器

    nginx配置图片服务器 server { listen 8001; server_name image.xxx.com; proxy_set_header X-Forwarded-Host $hos ...

  10. MaxCompute问答整理之8月

    本文是基于对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助. 问题一.通过数据源数据增量同步后,如何查看某一条数据具体被同步到MaxCompute ...