restful API接口可以很方便的让其他系统调用,为了让指定的用户/系统可以调用开放的接口,一般需要对接口做认证;

接口认证有两种方式: 1、认证的token当做post/get的参数,server端拿到该参数后进行比对; 2、将认证的token加到http header中,server端解析header,拿到token进行比对,这也是最常用的方式;

下面针对第二种方式,进行详细的说明:

客户端请求http 的接口,python提供了requests模块,可以很方便的实现,在请求的时候,需要将请求的参数和认证的token携带过去;但是这样做,有可能是不安全的,因为token是不变的,在使用的过程中存在泄漏或者http请求被劫持的问题;所以,为了保证安全,最好传输的token是加密的,并且是一直变化着的;比较好实现方法是:获取当前的时间戳,和token拼接之后做MD5加密,发送到server端,server 再根据当前的时间戳和token拼接的字符串做md5,结果和接收到的字符串比对,但问题是数据在网络中传输存在延迟,所以时间戳两端对不上,所以客户端在发送的时候,还需要将时间戳一同发过去,所以最终发送的字符串实现如下:

import hashlib
import time
current_time = str(time.time())
m = hashlib.md5()
m.update(bytes(appid+current_time,encoding='utf-8'))
new_appid = m.hexdigest() new_new_appid = "%s|%s" %(new_appid,current_time)
print(new_new_appid)

server端split('|')接收到的字符串,获取时间戳,和token拼接,做MD5校验之后,与加密的密文比对;

但是问题又来了,一旦用户成功的请求被拦截,就可以获取加密的密文和时间戳,这一串字符串可以直接被server验证通过;

所以,最终的解决方式是:在server端维护一个列表,一旦成功的用户请求到来,将其加密的密文加到列表中,下一次请求到来后,先检查加密的字符串是否在列表中,如果存在,直接返回失败,如果不存在,并且时间在10s以内,再做后续的操作。需要注意的是,列表维护的信息,是10s(或其他时间段)以内的;如果这个列表存在于redis或者memcache中,可以借助redis和memcache的特性,删除10s以前的数据,会更简单;

下面是参考代码:

client side:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = "charles" import requests
appid = 'asjdhjasdasgdd' import hashlib
import time
current_time = str(time.time())
m = hashlib.md5()
m.update(bytes(appid+current_time,encoding='utf-8'))
new_appid = m.hexdigest() new_new_appid = "%s|%s" %(new_appid,current_time)
print(new_new_appid) response = requests.get(
url='http://127.0.0.1:8080/asset/',
# params={'appid',appid},
headers = {'appid':new_new_appid}
)
print(response.text)

 

server side:

from django.shortcuts import render,HttpResponse

# Create your views here.

from  django.views import View
import hashlib
import time class AssetView(View):
#1.时间 2.是否已经存在 3.正向加密
def get(self,request,*args,**kwargs):
visited = [] #列表需要维护时间,如果使用redis或者memcache就简单了
req_appid = request.META['HTTP_APPID']
print(req_appid)
APPID = 'asjdhjasdasgdd' v,client_time = req_appid.split('|')
current_time = time.time()
float_client_time = float(current_time)
if current_time - 10 > float_client_time:
return HttpResponse('验证失败')
if req_appid in visited:
return HttpResponse('验证失败')
m = hashlib.md5()
m.update(bytes(APPID+client_time,encoding='utf-8'))
new_appid = m.hexdigest()
if new_appid == v:
visited.append(req_appid)
return HttpResponse('...')
else:
return HttpResponse('去你的吧。。。')

API接口认证的更多相关文章

  1. 最安全的api接口认证

    最安全的api接口认证 实现步骤: 1.客户端与服务器都存放着用于验证的Token字段,客户端在本地把自己的 用户名+时间戳+Token 组合进行MD5加密后生成一段新的md5-token. 2.客户 ...

  2. spring boot 2 集成JWT实现api接口认证

    JSON Web Token(JWT)是目前流行的跨域身份验证解决方案.官网:https://jwt.io/本文使用spring boot 2 集成JWT实现api接口验证. 一.JWT的数据结构 J ...

  3. 每天一点点之laravel框架 - Laravel5.6 + Passport实现Api接口认证

    1.首先通过 Composer 包管理器安装 Passport: composer require laravel/passport 注:如果安装过程中提示需要更高版本的 Laravel:larave ...

  4. python api接口认证脚本

    import requests import sys def acces_api_with_cookie(url_login, USERNAME, PASSWORD, url_access):     ...

  5. Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证

    #settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...

  6. 03: zabbix API接口 对 主机、主机组、模板、应用集、监控项、触发器等增删改查

    目录:Django其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...

  7. api接口思路介绍

    现在很流行api了,但各种api做法不一样,下面我整理了一些自己的想法,也是看了各大门户网站开放的api应用想到的,与大家分享分享,高手跳过.   API(Application Programmin ...

  8. api接口对于客户端的身份认证方式以及安全措施

    转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsession ...

  9. 使用Flask设计带认证token的RESTful API接口

    大数据时代 Just a record. 使用Flask设计带认证token的RESTful API接口[翻译] 上一篇文章, 使用python的Flask实现一个RESTful API服务器端  简 ...

随机推荐

  1. LINUX系统配置

    LINUX系统配置 Linux 安装jdk方法; Linux Tomcat 安装与配置 Linux redis 安装与配置 (例1) Linux redis安装配置(例2) NGINX 安装 Linu ...

  2. 关于C#中break和continue的认识

    1.在昨天我在做循环处理的时候,遇到了break和continue的使用问题,今天来总结了一下, break: for (int i=0;i<5;i++) { a++; if(a==1) bre ...

  3. Ubuntu Desktop 编译 ffmpeg (简略的写写)

    关于ffmpeg FFmpeg是一個自由軟體,可以執行音訊和視訊多種格式的錄影.轉檔.串流功能,包含了libavcodec——這是一個用於多個專案中音訊和視訊的解碼器函式庫,以及libavformat ...

  4. c语言笔记3运算符与表达式

    运算符与表达式 知识点一 操作数:参与运算的具体对象. 运算符:指明了对操作数进行的某项运算. 表达式:表示一个求值得规则.它由变量.常量.运算符和函数.括号按一定规则组成. 书写表达式的细节:1,运 ...

  5. ngnix 500错误原因分析

    参考http://www.cnblogs.com/huqiang/p/5333975.html

  6. 录制JMeter脚本的方式

    一.使用BadBoy录制JMeter脚本 JMeter和BadBoy下载地址:点击去下载 1.打开BadBoy并输入你要录制脚本的网址 这里我输入百度的网址,可以看到step下已经有一个请求了 2.录 ...

  7. The Tower of Babylon(UVa 437)

    题意:有n种立方体,每种都有无穷多个.选一些正方体摞成一根尽量高的柱子(可以选择任意一条边做高),使得每个立方体的底面长宽分别严格小于它下方的立方柱的底面长宽. 题解:可以套用DAG最长路算法,可以使 ...

  8. linux sar命令详解

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...

  9. 【SpringBoot】Logback日志框架介绍和SpringBoot整合实战

    ========================11.Logback日志框架介绍和SpringBoot整合实战 2节课================================ 1.新日志框架L ...

  10. 如何在Python中使用ZeroMQ和Docker构建微服务架构

    @Container容器技术大会将于6月4日在上海光大会展中心国际大酒店举办,来自携程.PPTV.蚂蚁金服.京东.浙江移动.海尔电器.唯品会.eBay.道富银行.麻袋理财等公司的技术负责人将带来实践经 ...