文档章节

nginx轻松实现api认证

那一剑的风情
 那一剑的风情
发布于 2015/07/30 14:11
字数 1031
阅读 5410
收藏 130

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

nginx本身是个极出色的http服务器,除此之外还可以跟应用服务器(比如api)结合,将独立业务(比如认证)分离出来,让应用服务器变的更灵活更强大。本文将以实际例子展现nginx的扩展性能力。

0. 需求:实现电影列表的接口

服务端程序员写了个接口,以提供其它人调用,接口要求以json格式返回一个电影列表数据。他用了世界上最好的语言开发,代码如下:

-- movie.php --

$rows = array(

    array('id' => 1, 'title' => 'Reggae'),

    array('id' => 4, 'title' => 'Indie'),

    array('id' => 5, 'title' => 'Rap'),

    array('id' => 6, 'title' => 'Cowbell')

);

$json = json_encode($rows);

echo $json;

?>

他很开心的提交了任务,但没过多久真正要花时间的考验来了。PM要求他给接口认证,不想让它成为公共接口。

1. 什么是认证

他是个google stackoverflow粉,几番翻墙后,决定以这种方式实现:让访问电影接口前先拿到一个token作为凭据,然后以此token访问接口。所以他把问题简化为两件事:

a)提供生成token的访问

b)在movie.php接口前作access token的验证

看着对接的程序员在那悠哉着等着他实现完提供接口,把接口格式定完先抛给他:

a)生成access_token

http://192.168.1.102/token?appid=some_id&secret=some_secret

b)给电影接口加个参数access_token

http://192.168.1.102/movie.php?access_token=some_token

并且多唠叨了几句:

* 你丫的把appid和secret的值保存好,不能暴露。

* access_token是有过期时间的。

2. 灵活的程序员

首先,他考虑到access_token需要存储、查找,越高效越好,用mysql+memcached or redis缓存吗?这次用点不一样的,快速高效的,于是他选了handlersocket的方式。handlersocket是mysql的一个插件,简单讲就是让操作mysql直通存储层。https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL

其次,他开始不现实的默念:如果有个人帮我把认证处理了,我专心写api就可以,不要让我的代码看到一丝认证的影子。思维总是一张纸而已,分分钟他开始尝试了这个想法。

* 先建oauth_access_token表

CREATE TABLE oauth_access_token (

    id int(10) NOT NULL AUTO_INCREMENT,

    access_token varchar(255) DEFAULT NULL,

    expires_in int(10) NOT NULL,

    last_used_time int(10) NOT NULL,

    PRIMARY KEY (id),

    KEY ACCESS_TOKEN (access_token)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


* 给api加上认证功能,不用改代码哦,直接在nginx配置里指定

upstream hsock_rsrv {

    server 192.168.100.133:9998;

    keepalive 1024;

}

upstream hsock_wsrv {

    server 192.168.100.133:9999;

    keepalive 1024;

}

server {

    listen       80;

    location / {

        root   html/api;

        index  index.php;

    }

    oauth_db        some_db;

    oauth_table     oauth_access_token;

    # 生成access_token

    location /token {

        oauth_token         hsock_wsrv;  # 指定handlersocket的写服务器,对应上面的upstream

        oauth_appid         some_appid;

        oauth_secret        some_secret;

        oauth_expires_in    2h;

    }

    location /check {

        oauth_check  hsock_rsrv; # 仅供api认证调用,返回200才是正常。外部不会访问

    }

    location ~ \.php$ {

        oauth_request /check; # 让api具备认证功能,对应上面的 location /check

        # 以下就是你的api配置了,以php为例

        root           html;

        fastcgi_pass   127.0.0.1:9000;

        fastcgi_index  index.php;

        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

        include        fastcgi_params;

    }

}

3. 缺少了什么

细心的你可能发现了,上面有几个指定是nginx不支持的,都是以oauth_开头:oauth_token, oauth_appid, oauth_secret, oauth_expires_in, oauth_check, oauth_request。oauth本身是个协议,有多种方式,从复杂到简单,这里的api认证只是其中一个简单的方式,以oauth这个命名有点哗众取宠,但是挺直观,所以还是用它作为模块的命名。到此,开始安装模块:

> git clone git@github.com:hongzhidao/nginx-http-oauth-module.git

> cd /work/nginx-1.8.0 && ./configure --add-module=/work/nginx-http-oauth-module && make && make install

源码下载:http://nglua.com/download/nginx-http-oauth-module.tar.gz

4. 集思广义

nginx具备很强的扩展能力,如果您的程序是构建在http之上,有些公共的模块可以交给nginx去处理,让程序本身只关注业务部分。github上已经有很多优秀的nginx模块。在nginx方面,有不少有意思的想法和代码,期待交流。
推荐原文:http://nglua.com/articles/16.html


© 著作权归作者所有

那一剑的风情

那一剑的风情

粉丝 122
博文 20
码字总数 21879
作品 0
厦门
程序员
私信 提问
加载中

评论(5)

HeyJobs
HeyJobs
这个有个非常大的问题,就是不能访问数据库获取appid和some_secret
那一剑的风情
那一剑的风情 博主

引用来自“zzuqiang”的评论

* 给api加上认证功能,不用改代码哦,直接在nginx配置里指定

upstream hsock_rsrv {

server 192.168.100.133:9998;

keepalive 1024;

}

upstream hsock_wsrv {

server 192.168.100.133:9999;

keepalive 1024;

}

以上配置:
server 192.168.100.133:9998;
server 192.168.100.133:9999;
同一个电脑IP下的不同端口9998和9999起的是什么服务?能详细说一下吗?
这两个server是handlersocket启动的服务,9998处理读操作,9999处理写操作
zzuqiang
zzuqiang
* 给api加上认证功能,不用改代码哦,直接在nginx配置里指定

upstream hsock_rsrv {

server 192.168.100.133:9998;

keepalive 1024;

}

upstream hsock_wsrv {

server 192.168.100.133:9999;

keepalive 1024;

}

以上配置:
server 192.168.100.133:9998;
server 192.168.100.133:9999;
同一个电脑IP下的不同端口9998和9999起的是什么服务?能详细说一下吗?
zendtrend
zendtrend
"看着对接的程序员在那悠哉着等着他实现完提供接口"这句话很精辟
java_sheng
java_sheng
虽然不会,但是感觉高大上............
云原生架构下的 API 网关实践:Kong (一)

API 网关选型 业界有很多流行的 API 网关,开源的有 Nginx、Netflix Zuul、Kong 等。当然 Kong 还有商业版,类似的商业版网关还有 GoKu API Gateway 和 Tyk 等。 GoKu API Gateway 是由国内公...

aoho
07/24
0
0
八步部署NGINX Plus API网关

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,作者ArrayZoneYour Nginx往往是构建微服务中必不可缺的一部分,从本文中你可以习得如何使用Nginx作为API...

腾讯云加社区
2018/06/22
0
0
云原生架构下的 API 网关实践: Kong (二)

Kong 是 Mashape 开源的一款云原生架构下的分布式 API 网关,其性能和可扩展性在同类组件中,表现都很优异。Kong 官方提供了很多直接可用的插件,此外,Kong 还可以通过插件扩展已有功能。 ...

aoho
08/26
0
0
docker registry nginx 安全访问控制

系统环境准备 centos7 [root@docker-130 etc]# docker -v Docker version 1.9.1, build a34a1d5 nginx 版本需要1.7.5以后的,因为需要一个add_header功能,我这里用的1.9 registry 2.1.1 安装......

雪地花露
2015/12/02
530
0
API Gateway性能比较:NGINX vs. ZUUL vs.Cloud Gateway vs. Linkerd[译]

2018-03-04 15:07 联发科的反思 前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay elik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx ...

sunsky303
2018/05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 浙江台的电话号码倒是记得挺牢

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Out On The Streets》 一直不理解北欧人对重金属和死亡摇滚的热情,听完这首歌好像理解了。#今日歌曲推荐# 《Out On The Stre...

小小编辑
今天
5
0
Leetcode PHP题解--D121 21. Merge Two Sorted Lists

D121 21. Merge Two Sorted Lists 题目链接 21. Merge Two Sorted Lists 题目分析 合并两个有序链表。 思路 逐个遍历两个链表,把小的数字塞入数组里。之后再拼起来。 最终代码 <?php/** *...

skys215
今天
5
0
mars-config 动态配置管理

mars-config 码云地址:https://gitee.com/fashionbrot/mars-config 介绍 spring mvc 、springboot 动态配置系统。http 轮训方式 更新 动态配置 软件架构 软件架构说明 后端使用技术 :sprin...

fashionbrot
今天
14
0
女朋友玩吃鸡手游被开挂老哥骗炮,我见义勇为将骗子绳之以法

大家好,我是乔哥。 晚上10点以后下班后我回到自如出租房里面,开始处理公众号粉丝发来的消息,一条一条处理,突然看到了这么几条消息,吸引了我的眼球: 然后我就和这位女粉丝小红(化名)聊...

gzc426
今天
9
0
两款软件

fadetop保护眼睛软件 Snipaste截图软件

伟大源于勇敢的开始
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部