最安全的api接口认证

最安全的api接口认证

实现步骤:

1、客户端与服务器都存放着用于验证的Token字段,客户端在本地把自己的 用户名+时间戳+Token 组合进行MD5加密后生成一段新的md5-token。

2、客户端访问的时候携带:用户名、时间戳、md5-token。

3、服务端收到请求后,先判断用户名、时间戳是否合法、假设先判断发送过来的时间戳和现在的时间戳不能大于2分钟。

4、如果是在2分钟之内,到redis里查看有没有该用户为key对应的md5-token,并判断它和发送过来的md5-token是否相同,如果有相同,说明该md5-token已经请求过,不能在操作,如果没找到相同的md5-token,说明是第一次请求,把用户名为key,md5-token为vallue存入redis,存在时间设为2分钟。

5、如果以上都通过了,在去数据库取出用户名和Token字段像客户端一样的方式进行加密。对比两个加密字段,相同则通过验证。

1、例如我们在请求的url后带上 用户名+时间戳+加密的Token

客户端

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
BaseDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

Params = {
    "server": "127.0.0.1",
    "port":8000,
    ‘request_timeout‘:30,
    "urls":{
          "asset_report_no_id":"/asset/asset_report_no_id/",
          "asset_report":"/asset/asset_report/",
        },
    ‘asset_id_path‘:‘%s/var/.asset_id‘ % BaseDir,
    ‘log_file‘: ‘%s/logs/run_log‘ % BaseDir,
    ‘auth‘:{
        ‘user‘:‘[email protected]‘,
        ‘token‘: ‘abc‘
        },
}

url=http://127.0.0.1:8000/asset/

import hashlib,time
def get_token(username,token_id):
    timestamp = int(time.time())
    md5_format_str = "%s\n%s\n%s" %(username,timestamp,token_id)
    obj = hashlib.md5()
    obj.update(md5_format_str)
    print "token format:[%s]" % md5_format_str
    print "token :[%s]" % obj.hexdigest()
    return obj.hexdigest()[10:17], timestamp

def attach_token(url_str):
    ‘‘‘生成一个加密验证在url后‘‘‘
    user = settings.Params[‘auth‘][‘user‘]
    token_id = settings.Params[‘auth‘][‘token‘]

    md5_token,timestamp = get_token(user,token_id)
    url_arg_str = "user=%s&timestamp=%s&token=%s" %(user,timestamp,md5_token)
    if "?" in url_str:
        new_url = url_str + "&" + url_arg_str
    else:
        new_url = url_str + "?" + url_arg_str
    return  new_url

#生成一个带着加密token的url
url = attach_token(url)

发送请求

data_encode = urllib.urlencode(asset_data)#asset_data为要发送的数据
req = urllib2.Request(url=url,data=data_encode)
res_data = urllib2.urlopen(req,timeout=settings.Params[‘request_timeout‘])
callback = res_data.read()
callback = json.loads(callback)
print (callback)

服务端

2、我们给服务端写一个装饰器token_required,用来验证

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time,hashlib,json
from asset import models
from django.shortcuts import render,HttpResponse
from cmdb import settings
from django.core.exceptions import ObjectDoesNotExist

def gen_token(username,timestamp,token):
    token_format = "%s\n%s\n%s" %(username,timestamp,token)
    obj = hashlib.md5()
    obj.update(token_format)
    return obj.hexdigest()[10:17]

def token_required(func):
    def wrapper(*args,**kwargs):
        response = {"errors":[]}
        get_args = args[0].GET
        username = get_args.get("user")
        token_md5_from_client = get_args.get("token")
        timestamp = get_args.get("timestamp")

        if not username or not timestamp or not token_md5_from_client:
            response[‘errors‘].append({"auth_failed":"This api requires token authentication!"})
            return HttpResponse(json.dumps(response))
        try:
            if abs(time.time() - int(timestamp)) > settings.TOKEN_TIMEOUT:#验证时间有没有超过2分钟
                response[‘errors‘].append({"auth_failed":"The token is expired!"})
            else:
                ‘‘‘如果没超过两分钟,检查redis里有没有这个加密token‘‘‘
                red_result = __redies_token(username,token_md5_from_client)
                if red_result:  #等于True说明是第一次请求,进入下一步验证
                    user_obj = models.MyUser.objects.get(email=username)
                    token_md5_from_server = gen_token(username,timestamp,user_obj.token)
                    if token_md5_from_client != token_md5_from_server:
                        response[‘errors‘].append({"auth_failed":"Invalid username or token_id"})
                    else:

                        print("通过验证")
                else:
                    response[‘errors‘].append({"auth_failed":"The token is expired!"})

                print("\033[41;1m;%s ---client:%s\033[0m" %(time.time(),timestamp), time.time() - int(timestamp))
        except ObjectDoesNotExist as e:
            response[‘errors‘].append({"auth_failed":"Invalid username or token_id"})
        if response[‘errors‘]:
            return HttpResponse(json.dumps(response))
        else:
            return  func(*args,**kwargs)
    return wrapper

def __redies_token(username,token_md5_from_client):
    import redis
    r = redis.Redis(host=‘192.168.0.109‘, port=6379)
    val =  r.get(username)
    if val == token_md5_from_client:
        print("是以请求过的token")
        return False
    else:#不存在,则以用户名为key,加密的token为value存入缓存,存在时间2分钟
        r.set(username, token_md5_from_client,ex=120)
        return True

原文地址:https://www.cnblogs.com/ExMan/p/9807154.html

时间: 2024-10-05 23:25:46

最安全的api接口认证的相关文章

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

JSON Web Token(JWT)是目前流行的跨域身份验证解决方案.官网:https://jwt.io/本文spring boot 2 集成JWT实现api接口验证. 一.JWT的数据结构 JWT由header(头信息).payload(有效载荷)和signature(签名)三部分组成的,用“.”连接起来的字符串.JWT的计算逻辑如下:(1)signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(

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

1.首先通过 Composer 包管理器安装 Passport: composer require laravel/passport 注:如果安装过程中提示需要更高版本的 Laravel:laravel/passport v5.0.0 requires illuminate/http ~5.6,可以通过指定版本来安装 composer require laravel/passport ~4.0. 2.注册服务提供者 将 Passport 的服务提供者注册到配置文件 config/app.php 

基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]

基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key(每个

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

转载 基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key

php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restful api 请明白一点,这个只是设计指导思想,也就是设计风格 ,比如你需要遵循这些原则 原则条件REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.从客户端到服务

微信红包API接口(PHP)

发布时间:2015年2月25日 / 分类:WEB开发,PHP / 74,825 / 241 ℃ 根据微信高级红包接口,开发PHP版本的API接口,现在进行主要代码分析. 红包接口调用请求代码,所有请求参数为必填参数与文档对应: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 class Wxapi {     private $a

Web API接口 安全验证

在上篇随笔<Web API应用架构设计分析(1)>,我对Web API的各种应用架构进行了概括性的分析和设计,Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端(包括浏览器,手机和平板电脑等移动设备)的框架,本篇继续这个主题,介绍如何利用ASP.NET Web API 来设计Web API层以及相关的调用处理. 1.Web API的接口访问分类 Web API接口的访问方式,大概可以分为几类: 1)一个是使用用户令牌,通过Web API接口进行数据访问.这种方式,可

Web APi之认证

Web APi之认证(Authentication)两种实现方式后续[三](十五) 前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络还是知其所以然,所以也无关紧要,停止学习以及分享是一件很痛苦的事情,心情很忐忑也很担忧,那么多牛逼的人都在无时无刻的学习更何况是略懂皮毛的我呢?好了,废话说了不少,我们接下来进入主题. 话题 看到博客也有对于我最近有

API接口开发 配置、实现、测试

Yii2 基于RESTful架构的 advanced版API接口开发 配置.实现.测试 环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_rewrite.so 将其前面的#去掉,如果没有找到则添加进去. 找到一下代码 <Directory "C:/phpStudy/Apache/cgi-bin"> AllowOverride