GVKun编程网logo

golang 实现 json web token(Golang 实现wps)

18

如果您想了解golang实现jsonwebtoken的相关知识,那么本文是一篇不可错过的文章,我们将对Golang实现wps进行全面详尽的解释,并且为您提供关于asp.netwebapiusejson

如果您想了解golang 实现 json web token的相关知识,那么本文是一篇不可错过的文章,我们将对Golang 实现wps进行全面详尽的解释,并且为您提供关于asp.net web api use json web token、egg基于jsonwebtoken的Token实现认证机制、Flask + PyJWT 实现基于Json Web Token的用户认证授权、golang jwt+token验证的实现的有价值的信息。

本文目录一览:

golang 实现 json web token(Golang 实现wps)

golang 实现 json web token(Golang 实现wps)

json web token 简介

  1. json web token 简称 jwt.他是一种轻量级的规范.这种规范允许客户端和服务端之间传递一些非敏感信息.
  2. 常用于用户认证和授权系统.

jwt组成部分

  1. Header
  2. Claims
  3. Signature
Header 组成部分
typ: "JWT",alg: "HS256",

1. typ是默认的一种标识.标识这条信息采用JWT规范.
2. alg表示签名使用的加密算法.通常有ES256,ES512,RS256等等

Claims 组成部分

Audience  string `json:"aud,omitempty"`
ExpiresAt int64  `json:"exp,omitempty"`
Id        string `json:"jti,omitempty"`
IssuedAt  int64  `json:"iat,omitempty"`
Issuer    string `json:"iss,omitempty"`
NotBefore int64  `json:"nbf,omitempty"`
Subject   string `json:"sub,omitempty"`

这段结构体是我们在golang中使用到的字段. 可以在这个的基础上进行组合,定义新的Claims部分.

1. aud 标识token的接收者.
2. exp 过期时间.通常与Unix UTC时间做对比过期后token无效
3. jti 是自定义的id号 
4. iat 签名发行时间.
5. iss 是签名的发行者.
6. nbf 这条token信息生效时间.这个值可以不设置,但是设定后,一定要大于当前Unix UTC,否则token将会延迟生效.
7. sub 签名面向的用户

通过设置exp与nbf来管理token的生命周期.

Signature 组成部分

  1. 将Header与Claims信息拼接起来[base64(header)+”.”+base64(claims)],采用Header中指定的加密算法进行加密,得到Signature部分.

token组成部分

  1. base64(header) + “.” + base64(claims) + “.” + 加密签名
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjI5NTg5MTA4MDYsImlzcyI6InRlc3QiLCJuYmYiOjE0Nzk0NTczMTZ9.57gqtlk1nNezXSa0VgWBOwu2b2FCDJ6wXizuJF6IY10

如上边的token,由2个点好分割.第一部分是iheader的base64编码,第二部分是claims的base64编码,第三部分是加密签名信息.

下边来简单的介绍下golang中使用操作token的简单过程.在使用这个示例前,请获取如下包:

go get github.com/dgrijalva/jwt-go

package main

import (
    "fmt"
    "time"

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

func main() {
    mySigningKey := []byte("hzwy23")
    // Create the Claims
    claims := &jwt.StandardClaims{
        NotBefore: int64(time.Now().Unix() - 1000),ExpiresAt: int64(time.Now().Unix() + 1000),Issuer:    "test",}

    token := jwt.NewWithClaims(jwt.SigningMethodHS256,claims)
    ss,err := token.SignedString(mySigningKey)
    fmt.Println("签名后的token信息:",ss)
    t,err := jwt.Parse(ss,func(*jwt.Token) (interface{},error) {
        return mySigningKey,nil
    })

    if err != nil {
        fmt.Println("parase with claims Failed.",err)
        return
    }
    fmt.Println("还原后的token信息claims部分:",t.Claims)
}

输出结果

签名后的token信息: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0Nzk0NjAzMjMsImlzcyI6InRlc3QiLCJuYmYiOjE0Nzk0NTgzMjN9.7qMftDWhLHzYcheCEFOoLyH698HUNCm0Sq_SOOqAC90
还原后的token信息claims部分: map[iss:test nbf:1.479458323e+09 exp:1.479460323e+09]

注意事项

如果token 信息parse后与签名信息不一致,则会爆出异常.

asp.net web api use json web token

asp.net web api use json web token

https://stackoverflow.com/que...


  • 安装nuget包 System.IdentityModel.Tokens.Jwt

Install-Package System.IdentityModel.Tokens.Jwt

  • JwtManager工具类

public static class JwtManager
{
    public static readonly string Secret = System.Configuration.ConfigurationManager.AppSettings["TokenSecret"];

    public static string GenerateToken(string username, int expireMinutes = 20)
    {
        var symmetricKey = Convert.FromBase64String(Secret);
        var tokenHandler = new JwtSecurityTokenHandler();

        var now = DateTime.UtcNow;
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[]
                    {
                    new Claim(ClaimTypes.Name, username)
                }),

            Expires = now.AddMinutes(expireMinutes),

            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(symmetricKey), SecurityAlgorithms.HmacSha256Signature)
        };

        var stoken = tokenHandler.CreateToken(tokenDescriptor);
        var token = tokenHandler.WriteToken(stoken);

        return token;
    }

    public static bool ValidateToken(string token, out string username)
    {
        username = null;

        var simplePrinciple = JwtManager.GetPrincipal(token);
        var identity = simplePrinciple.Identity as ClaimsIdentity;

        if (identity == null)
            return false;

        if (!identity.IsAuthenticated)
            return false;

        var usernameClaim = identity.FindFirst(ClaimTypes.Name);
        username = usernameClaim?.Value;

        if (string.IsNullOrEmpty(username))
            return false;

        // More validate to check whether username exists in system

        return true;
    }

    public static ClaimsPrincipal GetPrincipal(string token)
    {
        try
        {
            var tokenHandler = new JwtSecurityTokenHandler();
            var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;

            if (jwtToken == null)
                return null;

            var symmetricKey = Convert.FromBase64String(Secret);

            var validationParameters = new TokenValidationParameters()
            {
                RequireExpirationTime = true,
                ValidateIssuer = false,
                ValidateAudience = false,
                IssuerSigningKey = new SymmetricSecurityKey(symmetricKey)
            };

            SecurityToken securityToken;
            var principal = tokenHandler.ValidateToken(token, validationParameters, out securityToken);

            return principal;
        }
        catch (Exception)
        {
            //should write log
            return null;
        }
    }
}

  • 添加ActionFilter

public class JwtAuthActionFilter : ActionFilterAttribute
{
    public static readonly TopException TOKEN_ERROR = new TopException(401, "token not auth");

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(false).Count > 0)
        {
            //no auth
            return;
        }

        var authorization = actionContext.Request.Headers.Authorization;

        if (authorization == null || authorization.Scheme != "Bearer")
        {
            throw TOKEN_ERROR;
        }
        else
        {
            string username;

            var token = authorization.Parameter;

            if (!JwtManager.ValidateToken(token, out username))
            {
                throw TOKEN_ERROR;
            }
        }

        base.OnActionExecuting(actionContext);
    }

    private static void setErrorResponse(HttpActionContext actionContext, string message)
    {
        var response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, message);
        actionContext.Response = response;
    }
}

  • 随机TokenSecret

function _arrayBufferToBase64(buffer) {
    var binary = '''';
    var bytes = buffer;
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) {
        binary += String.fromCharCode(bytes[i]);
    }
    return window.btoa(binary);
}

function GetTokenSecret(len = 24) {
    let buf = new ArrayBuffer(len)

    for (let i = 0; i < len; i++) {
        buf[i] = parseInt(Math.random() * 1000 % 255, 10)
    }

    return _arrayBufferToBase64(buf)
}

egg基于jsonwebtoken的Token实现认证机制

egg基于jsonwebtoken的Token实现认证机制

Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

相关技术点

eggmiddleware
jwt官网
node-jsonwebtoken

安装

npm install jsonwebtoken

Middleware中间件编写

在middleware文件下新建一个jwt.js文件

''use strict''
const fs = require(''fs'')
const path = require(''path'')
const jwt = require(''jsonwebtoken'') //引入jsonwebtoken

module.exports = (options, app) => {
  return async function userInterceptor(ctx, next) {
    let authToken = ctx.header.authorization // 获取header里的authorization
    if (authToken) {
      authToken = authToken.substring(7)
      const res = verifyToken(authToken) // 解密获取的Token
      if (res.corpid && res.userid) {
        // 如果需要限制单端登陆或者使用过程中废止某个token,或者更改token的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效
        // 此处使用redis进行保存
        const redis_token = await app.redis.get(''loginToken'').get(res.corpid + res.userid) // 获取保存的token
        if (authToken === redis_token) {
          ctx.locals.corpid = res.corpid
          ctx.locals.userid = res.userid
          await next()
        } else {
          ctx.body = { code: 50012, msg: ''您的账号已在其他地方登录'' }
        }
      } else {
        ctx.body = { code: 50012, msg: ''登录状态已过期'' }
      }
    } else {
      ctx.body = { code: 50008, msg: ''请登陆后再进行操作'' }
    }
  }
}

// 解密,验证
function verifyToken(token) {
  const cert = fs.readFileSync(path.join(__dirname, ''../public/rsa_public_key.pem'')) // 公钥,看后面生成方法
  let res = ''''
  try {
    const result = jwt.verify(token, cert, { algorithms: [ ''RS256'' ] }) || {}
    const { exp } = result,
      current = Math.floor(Date.now() / 1000)
    if (current <= exp) res = result.data || {}
  } catch (e) {
    console.log(e)
  }
  return res
}

使用中间件

在 config.default.js 中加入下面的配置就完成了中间件的开启和配置

// 方法一:在应用中使用中间件
config.middleware = [ ''jwt'' ]

config.jwt = {
    enable: true,
    ignore: [ ''/api/v1/test/'', ''/public/'' ], // 哪些请求不需要认证
}

// 方法二:router中使用中间件
module.exports = app => {
  const jwt = app.middleware.jwt();
  app.router.get(''/api/v1/test/'', jwt, app.controller.test.test);
};

token生成

建议写在 helper 里,方便调用

loginToken(data, expires = 7200) {
  const exp = Math.floor(Date.now() / 1000) + expires
  const cert = fs.readFileSync(path.join(__dirname, ''../public/rsa_private_key.pem'')) // 私钥,看后面生成方法
  const token = jwt.sign({ data, exp }, cert, { algorithm: ''RS256'' })
  return token
}

调用token生成方法

const token = ctx.helper.loginToken({ corpid: usersData.corpid, userid: usersData.userid }, 7200) // token生成
await app.redis.get(''loginToken'').set(usersData.corpid + usersData.userid, token, ''ex'', 7200) // 保存到redis
ctx.body = { data: { token, expires: this.config.login_token_time }, code: 1, msg: ''登录成功'' } // 返回前端

前端使用

设置headers的Authorization = ''Bearer '' + Token Bearer后面要加空格

例:axios中
// request拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers[''Authorization''] = `Bearer ${getToken()}`
  }
  return config
}, error => {
  console.log(error)
  Promise.reject(error)
})

利用Openssl生成私钥公钥

此处介绍window下已安装git的方法
设置环境变量
我的电脑 > 右键 > 属性 > 高级系统设置 > 环境变量 > path > 编辑 > 新建git路径\bingit路径\usr\bin
如:C:\Program Files\Git\binC:\Program Files\Git\usr\bin
生成公钥:openssl genrsa -out rsa_private_key.pem 1024
生成私钥: openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

END

欢迎关注我的博客

Flask + PyJWT 实现基于Json Web Token的用户认证授权

Flask + PyJWT 实现基于Json Web Token的用户认证授权

这是我在做用户认证开发过程中看到一位大神写的文章,不过源地址已经失效了,希望有可能未来还能看到传送门。在此转载是不忍心这么好的文章绝版

我在 github 上找到了作者的源码,有需要的可以去下载https://github.com/yaoyonstudio/flask-pyjwt-auth

在这里插入图片描述


在程序开发中,用户认证授权是一个绕不过的重难点。以前的开发模式下,cookie和session认证是主流,随着前后端分离的趋势,基于Token的认证方式成为主流,而JWT是基于Token认证方式的一种机制,是实现单点登录认证的一种有效方法。

PyJWT是一个用来编码和解码JWT(JSON Web Tokens)的Python库,也可以用在Flask上。本文就通过一个实例来演示Flask项目整合PyJWT来实现基于Token的用户认证授权。

一、需求

1、程序将实现一个用户注册、登录和获取用户信息的功能

2、用户注册时输入用户名(username)、邮箱(email)和密码(password),用户名和邮箱是唯一的,如果数据库中已有则会注册失败;用户注册成功后返回用户的信息。

3、用户使用用户名(username)和密码(password)登录,登录成功时返回token,每次登录都会更新一次token。

4、用户要获取用户信息,需要在请求Header中传入验证参数和token,程序会验证这个token的有效性并给出响应。

5、程序构建方面,将用户和认证分列两个模块。

二、程序目录结构

根据示例需求构建程序目录结构:

在这里插入图片描述

三、程序实现

1、程序构建及相关文件

数据迁移配置文件:

flask-pyjwt-auth/db.py

from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand
from run import app
from app import db

app.config.from_object('app.config')

db.init_app(app)

migrate = Migrate(app,db)
manager = Manager(app)
manager.add_command('db',MigrateCommand)

if __name__ == '__main__':
    manager.run()

运行入口文件:

flask-pyjwt-auth/run.py

from app import create_app

app = create_app('app.config')

if __name__ == '__main__':
    app.run(host=app.config['HOST'],port=app.config['PORT'],debug=app.config['DEBUG'])

程序初始化文件:

flask-pyjwt-auth/app/__init__.py

from flask import Flask,request
from flask_sqlalchemy import sqlAlchemy

db = sqlAlchemy()

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_object(config_filename)

    @app.after_request
    def after_request(response):
        response.headers.add('Access-Control-Allow-Origin','*')
        if request.method == 'OPTIONS':
            response.headers['Access-Control-Allow-Methods'] = 'DELETE,GET,POST,PUT'
            headers = request.headers.get('Access-Control-Request-Headers')
            if headers:
                response.headers['Access-Control-Allow-Headers'] = headers
        return response

    from app.users.model import db
    db.init_app(app)

    from app.users.api import init_api
    init_api(app)

    return app

上面代码加入了全局HTTP请求头配置,设置允许所有跨域请求。

配置文件:

flask-pyjwt-auth/app/config.py

DB_USER = 'root'
DB_PASSWORD = ''
DB_HOST = 'localhost'
DB_DB = 'flask-pyjwt-auth'

DEBUG = True
PORT = 3333
HOST = "192.168.1.141"
SECRET_KEY = "my blog"

sqlALCHEMY_TRACK_MODIFICATIONS = False
sqlALCHEMY_DATABASE_URI = 'MysqL://' + DB_USER + ':' + DB_PASSWORD + '@' + DB_HOST + '/' + DB_DB

公共文件:

flask-pyjwt-auth/app/common.py

def trueReturn(data,msg):
    return {
        "status": True,"data": data,"msg": msg
    }


def falseReturn(data,msg):
    return {
        "status": False,"msg": msg
    }
2、用户模块

模块入口(空)

flask-pyjwt-auth/app/users/__init__.py

#

用户模型:

flask-pyjwt-auth/app/users/model.py

from flask_sqlalchemy import sqlAlchemy
from sqlalchemy.exc import sqlAlchemyError
from werkzeug.security import generate_password_hash,check_password_hash

from app import db

class Users(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    email = db.Column(db.String(250),unique=True,nullable=False)
    username = db.Column(db.String(250),nullable=False)
    password = db.Column(db.String(250))
    login_time = db.Column(db.Integer)

    def __init__(self,username,password,email):
        self.username = username
        self.password = password
        self.email = email

    def __str__(self):
        return "Users(id='%s')" % self.id

    def set_password(self,password):
        return generate_password_hash(password)

    def check_password(self,hash,password):
        return check_password_hash(hash,password)

    def get(self,id):
        return self.query.filter_by(id=id).first()

    def add(self,user):
        db.session.add(user)
        return session_commit()

    def update(self):
        return session_commit()

    def delete(self,id):
        self.query.filter_by(id=id).delete()
        return session_commit()


def session_commit():
    try:
        db.session.commit()
    except sqlAlchemyError as e:
        db.session.rollback()
        reason = str(e)
        return reason

在上面用户模型定义中,定义了set_password和check_password方法,分别用来加密用户注册时填写的密码(将加密后的密码写入数据库)和在用户登录时检查用户密码是否正确。

用户相关接口实现:

flask-pyjwt-auth/app/users/api.py

from flask import jsonify,request
from app.users.model import Users
from app.auth.auths import Auth
from .. import common

def init_api(app):
    @app.route('/register',methods=['POST'])
    def register():
        """
        用户注册
        :return: json
        """
        email = request.form.get('email')
        username = request.form.get('username')
        password = request.form.get('password')
        user = Users(email=email,username=username,password=Users.set_password(Users,password))
        result = Users.add(Users,user)
        if user.id:
            returnUser = {
                'id': user.id,'username': user.username,'email': user.email,'login_time': user.login_time
            }
            return jsonify(common.trueReturn(returnUser,"用户注册成功"))
        else:
            return jsonify(common.falseReturn('','用户注册失败'))


    @app.route('/login',methods=['POST'])
    def login():
        """
        用户登录
        :return: json
        """
        username = request.form.get('username')
        password = request.form.get('password')
        if (not username or not password):
            return jsonify(common.falseReturn('','用户名和密码不能为空'))
        else:
            return Auth.authenticate(Auth,password)


    @app.route('/user',methods=['GET'])
    def get():
        """
        获取用户信息
        :return: json
        """
        result = Auth.identify(Auth,request)
        if (result['status'] and result['data']):
            user = Users.get(Users,result['data'])
            returnUser = {
                'id': user.id,'login_time': user.login_time
            }
            result = common.trueReturn(returnUser,"请求成功")
        return jsonify(result)

上面用户模块的API实现代码中,先从auth模块中导入Auth类,在用户登录接口中,调用Auth类的authenticate方法来执行用户认证,认证通过则返回token,认证不通过则返回错误信息。在获取用户信息的接口,首先要进行“用户鉴权”,只有拥有权限的用户才有权限拿到用户信息。

3、认证模块

模块入口(空)

flask-pyjwt-auth/app/auth/__init__.py

#

授权认证处理:

flask-pyjwt-auth/app/auth/auths.py

import jwt,datetime,time
from flask import jsonify
from app.users.model import Users
from .. import config
from .. import common

class Auth():
    @staticmethod
    def encode_auth_token(user_id,login_time):
        """
        生成认证Token
        :param user_id: int
        :param login_time: int(timestamp)
        :return: string
        """
        try:
            payload = {
                'exp': datetime.datetime.utcNow() + datetime.timedelta(days=0,seconds=10),'iat': datetime.datetime.utcNow(),'iss': 'ken','data': {
                    'id': user_id,'login_time': login_time
                }
            }
            return jwt.encode(
                payload,config.SECRET_KEY,algorithm='HS256'
            )
        except Exception as e:
            return e

    @staticmethod
    def decode_auth_token(auth_token):
        """
        验证Token
        :param auth_token:
        :return: integer|string
        """
        try:
            # payload = jwt.decode(auth_token,app.config.get('SECRET_KEY'),leeway=datetime.timedelta(seconds=10))
            # 取消过期时间验证
            payload = jwt.decode(auth_token,options={'verify_exp': False})
            if ('data' in payload and 'id' in payload['data']):
                return payload
            else:
                raise jwt.InvalidTokenError
        except jwt.ExpiredSignatureError:
            return 'Token过期'
        except jwt.InvalidTokenError:
            return '无效Token'


    def authenticate(self,password):
        """
        用户登录,登录成功返回token,写将登录时间写入数据库;登录失败返回失败原因
        :param password:
        :return: json
        """
        userInfo = Users.query.filter_by(username=username).first()
        if (userInfo is None):
            return jsonify(common.falseReturn('','找不到用户'))
        else:
            if (Users.check_password(Users,userInfo.password,password)):
                login_time = int(time.time())
                userInfo.login_time = login_time
                Users.update(Users)
                token = self.encode_auth_token(userInfo.id,login_time)
                return jsonify(common.trueReturn(token.decode(),'登录成功'))
            else:
                return jsonify(common.falseReturn('','密码不正确'))

    def identify(self,request):
        """
        用户鉴权
        :return: list
        """
        auth_header = request.headers.get('Authorization')
        if (auth_header):
            auth_tokenArr = auth_header.split(" ")
            if (not auth_tokenArr or auth_tokenArr[0] != 'JWT' or len(auth_tokenArr) != 2):
                result = common.falseReturn('','请传递正确的验证头信息')
            else:
                auth_token = auth_tokenArr[1]
                payload = self.decode_auth_token(auth_token)
                if not isinstance(payload,str):
                    user = Users.get(Users,payload['data']['id'])
                    if (user is None):
                        result = common.falseReturn('','找不到该用户信息')
                    else:
                        if (user.login_time == payload['data']['login_time']):
                            result = common.trueReturn(user.id,'请求成功')
                        else:
                            result = common.falseReturn('','Token已更改,请重新登录获取')
                else:
                    result = common.falseReturn('',payload)
        else:
            result = common.falseReturn('','没有提供认证token')
        return result

认证模块实现token的生成、解析,以及用户的认证和鉴权。

首先要安装PyJWT

Pip install pyjwt

认证模块的实现主要包括下面4个部分(方法):

(1)encode_auth_token方法用来生成认证Token

要生成Token需要用到pyjwt的encode方法,这个方法可以传入三个参数,如示例:

jwt.encode(payload,algorithm=’HS256′)

上面代码的jwt.encode方法中传入了三个参数:第一个是payload,这是认证依据的主要信息,第二个是密钥,这里是读取配置文件中的SECRET_KEY配置变量,第三个是生成Token的算法。

这里稍微讲一下payload,这是认证的依据,也是后续解析token后定位用户的依据,需要包含特定用户的特定信息,如本例注册了data声明,data声明中包括了用户ID和用户登录时间两个参数,在“用户鉴权”方法中,解析token完成后要利用这个用户ID来查找并返回用户信息给用户。这里的data声明是我们自己加的,pyjwt内置注册了以下几个声明:

  • “exp”: 过期时间
  • “nbf”: 表示当前时间在nbf里的时间之前,则Token不被接受
  • “iss”: token签发者
  • “aud”: 接收者
  • “iat”: 发行时间

要注意的是”exp”过期时间是按当地时间确定,所以设置时要使用utc时间。

(2)decode_auth_token方法用于Token验证

这里的Token验证主要包括过期时间验证和声明验证。使用pyjwt的decode方法解析Token,得到payload。如:

jwt.decode(auth_token,options={‘verify_exp’: False})

上面的options设置不验证过期时间,如果不设置这个选项,token将在原payload中设置的过期时间后过期。

经过上面解析后,得到的payload可以跟原来生成payload进行比较来验证token的有效性。

(3)authenticate方法用于用户登录验证

这个方法进行用户登录验证,如果通过验证,先把登录时间写入用户记录,再调用上面第一个方法生成token,返回给用户(用户登录成功后,据此token来获取用户信息或其他操作)。

(4)identify方法用于用户鉴权

当用户有了token后,用户可以拿token去执行一些需要token才能执行的操作。这个用户鉴权方法就是进一步检查用户的token,如果完全符合条件则返回用户需要的信息或执行用户的操作。

用户鉴权的操作首先判断一个用户是否正确传递token,这里使用header的方式来传递,并要求header传值字段名为“Authorization”,字段值以“JWT”开头,并与token用“ ”(空格)隔开。

用户按正确的方式传递token后,再调用decode_auth_token方法来解析token,如果解析正确,获取解析出来的用户信息(user_id)并到数据库中查找详细信息返回给用户。

四、运行结果

1、注册成功

在这里插入图片描述

2、注册失败

在这里插入图片描述

3、登录成功

在这里插入图片描述

4、登录失败

在这里插入图片描述

5、成功获取用户信息

在这里插入图片描述

6、用户重新登录,token变更,原token无法获取用户信息

在这里插入图片描述

7、不带token请求,无法获取用户信息

在这里插入图片描述

PyJWT的使用比较简单,也比较安全,本文基本涵盖了Flask和PyJWT的整合和使用过程,希望对大家有用。本文完。

golang jwt+token验证的实现

golang jwt+token验证的实现

Token验证是验证用户身份的重要方式,在golang开发中具有广泛应用,文中主要阐述了利用jwt包加密后的token验证。

导入包:

import (
  "github.com/dgrijalva/jwt-go"
)
// GenerateToken 生成Token
func GenerateToken(mapClaims jwt.MapClaims, key string) (string, error) {
  token := jwt.NewWithClaims(jwt.SigningMethodHS256, mapClaims)
  return token.SignedString([]byte(key))
}
// 验证token
func checkToken(uid int64,token *jwt.Token) bool {
  tokens, _ := token.SignedString([]byte(JWTKey))
  redisToken, _ := GetMemberToken(uid)
  if tokens != redisToken {
   return false
  }
  return true
}

用户登录请求取出token

token, err := request.ParseFromRequest(r, request.AuthorizationHeaderExtractor, func(token *jwt.Token) (interface{}, error) {
  return []byte(JWTKey), nil
})
if err == nil && token.Valid {
  tokenMap := token.Claims.(jwt.MapClaims)
  uidStr := tokenMap["uid"].(string)
  uid, _ := strconv.ParseInt(uidStr,10,64)

  if !checkToken(uid, token) {
   // 验证token 是否合法
   base.ErrorResponse(w, http.StatusUnauthorized, "Authorization Is Invalid")
   return
  }
}

token主要是生成,验证,以及用户请求时解析token得出用户uid和token的有效性

到此这篇关于golang jwt+token验证的实现的文章就介绍到这了,更多相关golang jwt+token验证内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • go语言使用jwt认证的实现
  • go语言beego框架jwt身份认证实现示例
  • golang中gin框架接入jwt使用token验证身份
  • go gin+token(JWT)验证实现登陆验证
  • 利用go-zero在Go中快速实现JWT认证的步骤详解
  • Golang基于JWT与Casbin身份验证授权实例详解

我们今天的关于golang 实现 json web tokenGolang 实现wps的分享就到这里,谢谢您的阅读,如果想了解更多关于asp.net web api use json web token、egg基于jsonwebtoken的Token实现认证机制、Flask + PyJWT 实现基于Json Web Token的用户认证授权、golang jwt+token验证的实现的相关信息,可以在本站进行搜索。

本文标签: