美文网首页
用故事的讲述 JWT

用故事的讲述 JWT

作者: 一百万个不确定 | 来源:发表于2019-06-28 17:55 被阅读0次

用讲故事的方法讲述 JWT

JWT 就像一张门禁卡

小明管理着一个小区的物业,负责整个小区的出入安全。刚开始的时候小明决定要保险一点,所有出入小区的都要验证业主的本人信息。

所以他搞了个规定,每个进小区的人都要验证身份证和指纹,通过后台证明你是业主才让你进去。刚开始的时候这个规定还行,但是随着小区的出入人员变多,处理速度太慢,小区业主经常需要排队进入小区。

收到了大量的投诉电话只后小明决定反思一下,决定使用门禁卡来解决这个效率问题。他于是让业主去物业做一个一次性的身份验证,通过了之后就发一张门禁卡给业主,不过门禁卡有期限限制,半年之后就需要更新一下,而且业主刷卡的时候,物业只需要验证下这是不是我们发的业主卡就行了。

物业在处理门禁卡信息的时候,会从门禁卡里面解密信息,那个信息里面带有业主自己本人的信息。

在这个故事里面,

  • 第一个的每次进入小区都需要验证就是传统的session登录方法
  • 门禁卡制度就是jwt

用python实践 JWT

使用JWT实践的方法很简单,就是分三部分。

  • 服务器验证是否是用户
  • 服务器为用户生成一个TOKEN
  • 用户访问服务器的时候带着那个TOKEN
  • 服务验证TOKEN是否合法
  • 用户访问内容

完整的例子

from flask import Flask, jsonify, request
from flask_jwt_extended import (
    JWTManager, jwt_required, create_access_token,
    get_jwt_identity
)

app = Flask(__name__)

# Setup the Flask-JWT-Extended extension
app.config['JWT_SECRET_KEY'] = 'super-secret'  # Change this!
jwt = JWTManager(app)


# Provide a method to create access tokens. The create_access_token()
# function is used to actually generate the token, and you can return
# it to the caller however you choose.
@app.route('/login', methods=['POST'])
def login():
    if not request.is_json:
        return jsonify({"msg": "Missing JSON in request"}), 400

    username = request.json.get('username', None)
    password = request.json.get('password', None)
    if not username:
        return jsonify({"msg": "Missing username parameter"}), 400
    if not password:
        return jsonify({"msg": "Missing password parameter"}), 400

    if username != 'test' or password != 'test':
        return jsonify({"msg": "Bad username or password"}), 401

    # Identity can be any data that is json serializable
    # 服务器为用户生成一个TOKEN
    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token), 200


# Protect a view with jwt_required, which requires a valid access token
# in the request to access.
@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
    # Access the identity of the current user with get_jwt_identity
    # 服务验证TOKEN是否合法
    current_user = get_jwt_identity()
    # 用户访问内容
    return jsonify(logged_in_as=current_user), 200


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

运行该程序

  • 用户如何获得token
curl -H "Content-Type: application/json" -X POST \
  -d '{"username":"test","password":"test"}' http://localhost:5000/login

代码会返回类似于

{"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6dHJ1ZSwianRpIjoiZjhmNDlmMjUtNTQ4OS00NmRjLTkyOWUtZTU2Y2QxOGZhNzRlIiwidXNlcl9jbGFpbXMiOnt9LCJuYmYiOjE0NzQ0NzQ3OTEsImlhdCI6MTQ3NDQ3NDc5MSwiaWRlbnRpdHkiOiJ0ZXN0IiwiZXhwIjoxNDc0NDc1NjkxLCJ0eXBlIjoiYWNjZXNzIn0.vCy0Sec61i9prcGIRRCbG8e9NV6_wFH2ICFgUGCLKpc"}

  • 用户访问的过程中带上token
export ACCESS="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6dHJ1ZSwianRpIjoiZjhmNDlmMjUtNTQ4OS00NmRjLTkyOWUtZTU2Y2QxOGZhNzRlIiwidXNlcl9jbGFpbXMiOnt9LCJuYmYiOjE0NzQ0NzQ3OTEsImlhdCI6MTQ3NDQ3NDc5MSwiaWRlbnRpdHkiOiJ0ZXN0IiwiZXhwIjoxNDc0NDc1NjkxLCJ0eXBlIjoiYWNjZXNzIn0.vCy0Sec61i9prcGIRRCbG8e9NV6_wFH2ICFgUGCLKpc"

然后访问接口

curl -H "Authorization: Bearer $ACCESS" http://localhost:5000/protected

最后返回

{
  "logged_in_as": "test"
}

相关文章

  • 用故事的讲述 JWT

    用讲故事的方法讲述 JWT JWT 就像一张门禁卡 小明管理着一个小区的物业,负责整个小区的出入安全。刚开始的时候...

  • JWT(JSON Web Token)认证机制

    JWT 是JSON Web Token的缩写。我们用大写的JWT表示这种认证机制,我们用小写的jwt来表示JWT机...

  • 用故事讲述真理

    故事的作用是一件非常神奇的事。 我们从现实的角度出发,去拆解一个故事,你会发现里面的人物是虚构的,人物的经历也是没...

  • JWT token认证

    本文主要讲述两方面的内容1JSON Web Token(JWT)的介绍说明2 JSON Web Token(JWT...

  • 单点登录问题总结

    jwt是什么? jwt是一种session信息存储方案,单点登录和是否用jwt没关系,jwt也是和系统内的流程一致...

  • 用热情去讲述故事

    今天主要分享的一个主题叫做热情讲过的讲故事的时候,你具备的第一要素热情,首先你应该要明白第一个问题,你为什么要跟别...

  • token验证jwt

    JWT全面解读、详细使用步骤 - 简书 jwt三部分 JWT头 有效载荷 签名 说明 jwt三个子串用.分割 有效...

  • AES 加密解密 CryptoJS + php 方案

    AES 加密解密 CryptoJS + php 方案 本来一直用 jwt[http://jwt.io],由于其明文...

  • ~故事开篇~

    从今天开始,用摄影和咖啡来讲述我的故事,讲述我身边的故事~

  • 用Jwt保护你的restful api

    什么是JWT JWT是“JSON Web Token”的英文缩写,是一种开放的工业标准方法(RFC 7519),用...

网友评论

      本文标题:用故事的讲述 JWT

      本文链接:https://www.haomeiwen.com/subject/gnbecctx.html