zoukankan      html  css  js  c++  java
  • API接口认证

    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('去你的吧。。。')
  • 相关阅读:
    微软的PDC2009开完了,上去淘Video喽,有不少好东西
    [摘要]Pushing the Limits of Windows: Paged and Nonpaged Pool From Mark Russinovich's blog
    [摘要]Pushing the Limits of Windows: Virtual Memory From Mark Russinovich's blog
    如何知道在Windbg中得到Memory type(也叫做caching type)
    用ImgBurn做了一张可以安装所有版本的Win7安装盘
    WF 工作流(5)
    ORACLE 綁定變量
    oracle inside(1)
    WF 工作流(1)
    WF 工作流(2)
  • 原文地址:https://www.cnblogs.com/cqq-20151202/p/6956878.html
Copyright © 2011-2022 走看看