Restful风格的HTTP Basic Athorization基本认证API接口

前言:

话说什么是基本认证? 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务 器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。

客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为xiaorui,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据 时,将密文附加于请求头(Request Header)中。

这样HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用 户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

写接口的时候,推荐大家用Restful方式的,因为这样更加的有序,灵巧REST只是风格,不是标准。用rest是为了避免有的方面容易有误解,比如说创建和更新某个URI代表的资源的时候,是用HTTP的PUT和POST命令。REST常用的四种HTTP命令,GET、DELETE、PUT和POST,对于GET和DELETE,一个是获取资源,一个是删除资源。

Python

GET /tickets # 获取ticket列表

GET /tickets/12 # 查看某个具体的ticket

POST /tickets # 新建一个ticket

PUT /tickets/12 # 更新ticket 12.

DELETE /tickets/12 #删除ticekt 12

为了配合描述基本认证,我这边说下以前的分析日志的工作 。

首先用awk来分析的nginx日志并分割,因为日志是scribe集中式收集的,就算按照小时分切了,但还是很大。因为是集中到了平台,所以需要看到他的进度和事件进度。 用awk切割并处理完了后,他会curl到 xiaorui.cc/nginx/log/cut post的数据是 记录所用时间,记录执行结束时间,以及告知log目录的情况。

当再次awk分析的时候 他会先get上次执行完后,日志的最后一个时间,然后用这个时间做为分析日志的开始时间,最后时间为日志文件的结尾, 分析处理完了后curl到 ops.com/nginx/fenxi post的数据是 开始时间戳 结束的时间戳 200的状态 404的状态 502的状态等等

当要删除前30天的数据,他会curl到 xiaorui.cc/nginx/rmlog post的数据是 删除的时间 文件名 ip地址。但是接口的安全没有做到位。

如果是restful的方式的话,他会在服务端来接收 请求的方式 是post get put delete。。。。 根据他的情况,再做二次的判断。。。。

Python

 

app.route('/echo', methods = ['GET', 'POST', 'PATCH', 'PUT', 'DELETE'])

def api_echo():

    if request.method == 'GET':

        return "ECHO: GET\n"

    elif request.method == 'POST':

        return "ECHO: POST\n"

    elif request.method == 'PATCH':

        return "ECHO: PACTH\n"

    elif request.method == 'PUT':

        return "ECHO: PUT\n"

    elif request.method == 'DELETE':

        return "ECHO: DELETE"

结果是:

GET /echoECHO: GETPOST /ECHOECHO: POST

再来说说:

为啥用基本认证,其实我以前从来不加的,麻烦。。。。

最一开始的认证方式是 在要传输的字符串里面加密一下,然后在server端进行逆向的解密,方法虽然有点搓,但是有效。

然后,再这个基础上 加个一个字段 比如:

Python

 

hello?pw=9sdf879u3RK3I&key=wolaile

这个需要再后端接受这个form表单的字段 接着用了nginx lua来实现反向python的接口。 nginx可以紧密的融洽lua,用户来访问的时候,我先通过lua来取数据库的账号和密码,ok 跳转到index.html bad 让他滚蛋。。。。 后来有些xx部门来找我,让我们加个密码认证,一个小接口用session来做经常会出现登出的情况,这个和我的server端有关系。 既然不用session,那就用基本认证,nginx的目录验证用的就是基本认证,一打开页面会出现提示框 让你输入账号和密码。。。。对,就是这个。

python的实现方式有不少,最好是用一个web框架 例如 tornado flask web.py django,他们都有库可以实现。

这里是用flask实现的,先写一个函数用来处理用户认证 。

Python

 

from functools import wraps

def check_auth(username, password):

    return username == 'admin' and password == 'secret'

def authenticate():

    message = {'message': "Authenticate."}

    resp = jsonify(message)

    resp.status_code = 401

    resp.headers['WWW-Authenticate'] = 'Basic realm="Example"'

    return resp

def requires_auth(f):

    @wraps(f)

    def decorated(*args, **kwargs):

        auth = request.authorization

        if not auth:

            return authenticate()

        elif not check_auth(auth.username, auth.password):

            return authenticate()

        return f(*args, **kwargs)

    return decorated

再来写路由表,web的框架是Flask,触发了route后,会调用认证的装饰器。

Python

@app.route('/secrets')

@requires_auth

def api_hello():

    return "http://xiaorui.cc

我们请求下 会出现 GET /secretsHTTP/1.0 401 UNAUTHORIZEDWWW-Authenticate: Basic realm=”Example”{ ”message”: “Authenticate.”}

如果我们加上账号和密码

curl -v -u “admin:secret” http://127.0.0.1:5000/secrets

return www.xiaorui.cc

其实基本认证就两个路数 一是在请求头中添加Authorization: Authorization: “Basic 用户名和密码的base64加密字符串” 二是在url中添加用户名和密码: http://userName:password@www.xiaorui.cc/statuses/friends_timeline.xml 下面来看下对于第一种在请求中添加Authorization头部的各种语言的实现代码。

原文发布于微信公众号 - nginx(nginx-study)

原文发表时间:2016-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

HTTP协议漫谈

简介 园子里已经有不少介绍HTTP的的好文章。对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将H...

40060
来自专栏云计算教程系列

如何在Ubuntu 16.04上将BIND配置为专用网络DNS服务器

管理服务器配置和基础架构的一个重要部分包括通过设置适当的域名系统(DNS),维护一种通过名称查找网络接口和IP地址的简便方法。使用完全限定的域名(FQDN)而不...

95200
来自专栏北京马哥教育

HTTP 协议漫谈

简介 网络上已经有不少介绍 HTTP 的好文章,对HTTP的一些细节介绍的比较好,所以本篇文章不会对 HTTP 的细节进行深究,而是从够高和更结构化的角度将 H...

316110
来自专栏运维小白

10.11 Linux网络相关

linux网络相关 ifconfig查看网卡ip(yum install net-tools) ifup ens33/ifdown ens33 设定虚拟网卡en...

32560
来自专栏Java技术栈

危险:会话固定攻击漏洞,你们的系统都堵上了吗?

什么是会话固定攻击? 会话固定攻击(session fixation attack)是利用应用系统在服务器的会话ID固定不变机制,借助他人用相同的会话ID获取...

4.1K50
来自专栏Laoqi's Linux运维专列

日常运维管理(二)

监控io性能 : 有时候发现系统cpu和内存均有剩余,但是负载却很高,使用vmstat发现b列和wa列负载很高,要是想更详细的查看磁盘状态,那我们就用到了今天所...

37460
来自专栏程序员同行者

构建NTP时间服务器

31920
来自专栏happyJared

基于Docker的Redis高可用集群搭建(redis-sentinel)

  之前介绍了用docker来搭建redis主从环境,但这只是对数据添加了从库备份(主从复制),当主库down掉的时候,从库是不会自动升级为主库的,也就是说,该...

75210
来自专栏Linux运维学习之路

Linux分区的注意事项以及远程连接排错

分区方式一般有三种 第一种:数据不是很重要 /boot(系统的引导分区): 系统引导的信息/软件 系统的内核   200M swap( 交换分区): 为了避免系...

235100
来自专栏颇忒脱的技术博客

多种认证、授权模型的比较

本文主要列举在如今前后端分离、手机App大行其道的现状下,用户认证、授权的几种做法及对比。

38330

扫码关注云+社区

领取腾讯云代金券