Python Bottle基于 token 的认证应用

  • #JWT

‘‘‘
JWT 代表 JSON Web Token ,它是一种用于认证头部的 token 格式。这个 token 帮你实现了在两个系统之间以一种安全的方式传递信息。
我们暂且把 JWT 作为“不记名 token”。一个不记名 token 包含了三部分:header,payload,signature。

header 是 token 的一部分,用来存放 token 的类型和编码方式,通常是使用 base-64 编码。

payload 包含了信息。你可以存放任一种信息,比如用户信息,产品信息等。它们都是使用 base-64 编码方式进行存储。
signature 包括了 header,payload 和密钥的混合体。密钥必须安全地保存储在服务端。

(https://zhuanlan.zhihu.com/p/19920223)

‘‘‘

  • Python jwt

https://github.com/jpadilla/pyjwt

# -*-coding:utf-8 -*-

import jwt

secret = b‘???\\\//>000‘

encoded = jwt.encode({‘user‘: ‘bottle‘}, secret, algorithm=‘HS256‘)
print encoded

decoded = jwt.decode(encoded, secret, algorithms=[‘HS256‘])

print decoded
  • 实践

使用mongodb保存用户数据

使用bottle做服务

  1. config.py
class settings(object):
    host = ‘localhost‘

    port = 12306

    secret = b‘---------00000???\\‘

  

  1. mongodb保存数据
user ={
    ‘name‘:‘user1‘,
    ‘passwd‘:‘passwd‘,
    ‘ident‘:0 #public
}

admin = {
    ‘name‘:‘bottle‘,
    ‘passwd‘:‘passwd2‘,
    ‘ident‘:1 #admin
}
  1. /login路由
@app.route(‘/login‘, method=‘POST‘)
def login():
    name   = request.forms.get(‘name‘)
    passwd = request.forms.get(‘passwd‘)
    ret = db.user.find_one({‘name‘:name})
    if ret and ret[‘passwd‘] == passwd:
         if ret.get(‘token‘, None):
            res = {
                ‘status‘: False,
                ‘data‘: "Error occured: " + ‘User already logined!‘
             }
            return res
         token = jwt.encode({‘user‘: name, ‘ident‘:ret[‘ident‘]}, settings.secret, algorithm=‘HS256‘)
         db.user.update({‘name‘:name}, {‘$set‘:{‘token‘:token}})
         res = {
            ‘status‘: True,
            ‘data‘: name,
            ‘token‘: token
         }
         return res
    else:
        res = {
            ‘type‘: False,
            ‘data‘: "Error occured: " + ‘User name or password wrong!!!‘
        }
        return res
  1. login_required  验证
def login_required():
    def decorator(func):
        def wrapper(*args, **kwargs):
            authorization = request.headers.get(‘authorization‘)
            if not authorization:
                 abort(403, "Sorry, access denied.")
            return func(authorization)
  return wrapper return decorator
  1. /me 测试路由
@app.route(‘/me‘)
@login_required()
def me(token):
    ret = db.user.find_one({‘token‘:token})
    if ret:
        ret.pop(‘_id‘)
        res = {
            ‘type‘:True,
            ‘data‘:ret
        }
        return res
    else:
        res = {
            ‘type‘:False,
            ‘data‘:"Error occured: " + ret
        }
        return res
  • 测试

使用curl测试

获取token
curl -d ‘name=bottle&passwd=passwd2‘ http://localhost:8080/login

使用token获取资源
curl -H ‘authorization:your_token‘ http://localhost:8080/me

  

  • 总结

测试结果十分满意的。

不过个人发现了几个问题或者说不足

1,使用pyjwt每次生成token是一样的?

2,token是不是还应该有时效?

3,  现在只是拿到token,那么token的权限认证呢?

时间: 2024-11-08 21:17:10

Python Bottle基于 token 的认证应用的相关文章

使用 AngularJS & NodeJS 实现基于 token 的认证应用(转)

认证是任何 web 应用中不可或缺的一部分.在这个教程中,我们会讨论基于 token 的认证系统以及它和传统的登录系统的不同.这篇教程的末尾,你会看到一个使用 AngularJS 和 NodeJS 构建的完整的应用. 一.传统的认证系统 在开始说基于 token 的认证系统之前,我们先看一下传统的认证系统. 用户在登录域输入 用户名 和 密码 ,然后点击 登录 : 请求发送之后,通过在后端查询数据库验证用户的合法性.如果请求有效,使用在数据库得到的信息创建一个 session,然后在响应头信息中

使用 AngularJS & NodeJS 实现基于 token 的认证应用

传统的认证系统 在开始说基于 token 的认证系统之前,我们先看一下传统的认证系统. 用户在登录域输入 用户名 和 密码 ,然后点击 登录 : 请求发送之后,通过在后端查询数据库验证用户的合法性.如果请求有效,使用在数据库得到的信息创建一个 session,然后在响应头信息中返回这个 session 的信息,目的是把这个 session ID 存储到浏览器中: 在访问应用中受限制的后端服务器时提供这个 session 信息: 如果 session 信息有效,允许用户访问受限制的后端服务器,并且

基于Token的WEB后台认证机制

几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使用的最简单的认证方式,只需提供用户名密码即可,但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少.因此,在开发对外开放的RESTful API时,尽量避免采用HTTP Basic Auth OAuth OAuth(开放授权)是一个开放的授权标准,允许用户让

基于token的多平台身份认证架构设计

基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 . 不同的客户端产生了不同的用户使用场景,这些场景: 有不同的环境安全威胁 不同的会话生存周期 不同的用户权限控制体系 不同级别的接口调用方式 综上所述,它们的身份认证方式也存在一定的区别. 本文将使用一定的篇幅对这些场景进行一些分析和梳理工作. 2   使用场景 下面是一些在IT服务常见的一些

5分钟搞懂:基于token的用户认证

用户认证 用户认证或者说用户登录是确认某人确实是某人的过程,生活中靠身份证,网络上就要靠账号和密码.用户提供账号和密码,网站通过与数据库中保存的账号与密码比对确认用户身份. 基于token的用户认证 基于token的用户认证原理很简单.让用户输入账号和密码,然后获得一个token(令牌),该token允许用户在不使用账号和密码的情况下访问特定的资源.一旦获得token,用户就获得了在一段时间内对特定资源的访问权限. 这个过程类似酒店开房,在酒店前台认证身份.登记入住,这个步骤相当于网站的登录,然

认证和SSO(五)-基于token的SSO

1.修改项目使其基于浏览器cookie的SSO 1.1.修改回调方法,获得到token后,由存放到session改为存放到cookie /** * 回调方法 * 接收认证服务器发来的授权码,并换取令牌 * * @param code 授权码 * @param state 请求授权服务器时发送的state */ @GetMapping("/oauth/callback") public void oauthCallback(@RequestParam String code, Strin

掌握基于 JWT 实现的 Token 身份认证

引语 最近正好在独立开发一个后台管理系统,涉及到了基于Token的身份认证,自己边学边用边做整理和总结,对基于JWT实现的Token的身份认证做一次相对比较全面的认识. 一.基于session的跨域身份验证 Internet服务无法与用户身份验证分开.一般过程如下. 用户向服务器发送用户名和密码. 验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中. 服务器向用户返回session_id,session信息都会写入到用户的Cookie. 用户的每个后续请求都将通过在Cookie中

基于token的鉴权机制 — JWT介绍

前言:在实际开发项目中,由于Http是一种无状态的协议,我们想要记录用户的登录状态,或者为用户创建身份认证的凭证,可以使用Session认证机制或者JWT认证机制. 什么是JWT? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可

Haytham个人博客开发日志 -- Flask+Vue基于token的登录状态与路由管理

指路牌 符合一下关键词,这篇博客有可能会对你有帮助 不使用工厂函数的Flask应用 不使用蓝本的Flask应用 Flask跨域配置 基于Token的登录状态管理 Flask+Vue Vue路由拦截 Axios 钩子 适用场景 这是一篇个人博客搭建的记录博客,也是一篇关于Flask和Vue的简单"工具书",最后的代码会包含Web开发中常用的功能.(不全,只是使用频率相对高的) 环境 系统: 无关 Flask(Python3) Vue(Node.js) 参考 <Flask Web开发