nginx轻松实现api认证

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 [email protected]: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方面,我有不少有意思的想法和代码,期待交流。

时间: 2024-11-10 01:04:54

nginx轻松实现api认证的相关文章

Angularjs 通过asp.net web api认证登录

Angularjs 通过asp.net web api认证登录 Angularjs利用asp.net mvc提供的asp.net identity,membership实现居于数据库的用户名/密码的认证登录 环境 Vs.net 2013 Asp.net mvc + web api Individual user accounts Angularjs Underscore 新建一个asp.net mvc+ web api project 注册一个test用户用于测试 新建一个用于登录验证用户名密码

Nginx、SSL双向认证、PHP、SOAP、Webservice、https

本文是1:1模式,N:1模式请参见新的一篇博客<SSL双向认证(高清版)> ----------------------------------------------------- 我是分割线 --------------------------------------------------------- 标题太长了不知道该怎么起,索性就把keyword列出来吧~ WebService的WS-*搞了一天没搞定,看样子PHP应该是彻底抛弃SOAP协议了,google翻烂了也没找到什么靠谱的解

laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证

第一部分: 安装passport 使? Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服务提供者注册到配置?件  config/app.php  的providers  数组中:(5.6后不用加 ) Laravel\Passport\PassportServiceProvider::class utf8 的 varchar 类型字符串最长255,换成utf8mb4最长是191,然而框架

Django REST framework 之 API认证

RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sessions 或 cookies 维护, 常用的做法是每个请求都发送一个秘密的 access token 来认证用户, 由于 access token 可以唯一识别和认证用户, API 请求应通过 HTTPS 来防止 man-in-the-middle(MitM)中间人攻击. 通

nginx启用status页面并实现nginx的登录账户认证

启用status页面并实现nginx的登录账户认证 开启status页面 1.查看编译安装时所编译的模块要开启status页面依赖于ngx_http_stub_status_module这个模块 [[email protected] ~]# nginx -V nginx version: nginx/1.14.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2

nginx反向代理和认证反向代理

认证反向代理 server { listen 443 ssl; ssl on; ssl_certificate /usr/local/nginx/ssl/cn.crt; ssl_certificate_key /usr/local/nginx/ssl/cn.key; server_name www.aa.com; location / { # proxy_redirect off; # proxy_set_header Host $host; # proxy_set_header X-Real-

Nginx简介及用户认证、访问控制和反向代理配置

Nginx 是一个很强大的高性能Web和反向代理服务器及及电子邮件(IMAP/POP3)代理服务器,由俄罗斯程序员设计师Igor Syaoev所开发,官方网站:http://nginx.org/  特点是占有内存少.并发能力强. Nginx配置文件及目录简介: - /usr/local/nginx/                                                           安装目录 - /usr/local/nginx/conf/nginx.conf  

Nginx服务的ssl认证和htpasswd认证

默认Nginx是没有ssl模块的,需要在编译安装的时候添加上ssl模块! 首先是需要安装Nginx服务,这里我们不做详细介绍,具体安装可以参考我的"Nginx介绍及安装配置". 使用Openssl生成证书 1.生成RSA密钥的方法 [[email protected] conf]# openssl genrsa -des3 -out kell.key 1024 Generating RSA private key, 1024 bit long modulus .++++++ ..+++

NGINX 配置 SSL 双向认证

对于 NGINX 的 HTTPS 配置,通常情况下我们只需要实现服务端认证就行,因为浏览器内置了一些受信任的证书颁发机构(CA),服务器端只需要拿到这些机构颁发的证书并配置好,浏览器会自己校验证书的可用性并通过 SSL 进行通讯加密. 但特殊情况下我们也需要对客户端进行验证,只有受信任的客户端才能使用服务接口,此时我们就需要启用双向认证来达到这个目的,只有 当客户端请求带了可用的证书才能调通服务端接口 . CA 与自签名 CA 是权威机构才能做的,并且如果该机构达不到安全标准就会被浏览器厂商“封