给 Nginx 增加 OAuth 支持(nginx(2)

为Debian定制Nginx

我们通常都会部署到Debian的发行版-通常是Ubuntu上作为我们的产品服务器。如果是这样,那将会非常简单,运行 dpkg -i nginx-custom 安装我们的定制包。这步骤如此简单你一运行它就完成了。

一些在搜索定制debian/ubuntu包时的笔记:

你可以通过 apt-get source PACKAGE_NAME来获取debian安装包。

Debian安装包受控于一个 rules文件,你需要sed-fu来操作它。

你可以通过编辑 control 文件来更新 deb包的依赖。注意这里指定了一些元依赖(meta-dependency)你不要去删除它,但是这些很容易分辨出来。

新的发布必须要在changelog里注明,否则包有可能不会被升级因为它可能已经被安装过了。你需要在表单里使用 +tag_name来指明哪些是你自己在baseline上新加的改动。我会额外加上一个数字-从0开始-指示出包的发布编号。

大多数的改动可以以某种方式自动更改,但是似乎没有一个简单的命令行工具可以创建定制的发布包。这也正是我们感兴趣的地方,如果你知道什么的话,请给我们给我们提供一些链接,工具或方法。

在运行这个伟大过程的同时,我构建了一个小的批处理脚本来自动化这个过程的主要步骤,你可以在gist on github上找到它。

在我意识到这个过程可以被脚本化之前仅仅花费了90个nginx包的构建时间。

全部OAuth

现在可以测试并部署嵌入Nginx的Lua脚本了,让我们开始Lua编程。

nginx-lua模块提供了一些辅助功能和变量来访问Nginx的绝大多数功能,显然我们可以通过access_by_lua中该模块提供的指令来强制打开OAuth认证。

当使用*_by_lua_file指令后,必须重载nginx来使其起作用。

我为SeatGeek用NodeJS创建了一个简单的OAuth2提供者类。这部分内容很简单,你也很容易获得你是通用语言的响应版本。

接下来,我们的OAuth API使用JSON来处理令牌(token)、访问级别(access level)和重新认证响应(re-authentication responses)。所以我们需要安装lua-cjson模块。

# install lua-cjson if [ ! -d lua-cjson-2.1.0 ]; then tar zxf lua-cjson-2.1.0.tar.gz fi cd lua-cjson-2.1.0 sed 's/i686/x86_64/' /usr/share/lua/5.1/luarocks/config.lua > /usr/share/lua/5.1/luarocks/config.lua-tmp rm /usr/share/lua/5.1/luarocks/config.lua mv /usr/share/lua/5.1/luarocks/config.lua-tmp /usr/share/lua/5.1/luarocks/config.lua luarocks make

我的OAuth提供者类使用了query-string来发送认证的错误信息,我们也需要在我们的Lua脚本中为其提供支持:

local args = ngx.req.get_uri_args() if args.error and args.error == "access_denied" then ngx.status = ngx.HTTP_UNAUTHORIZED ngx.say("{\"status\": 401, \"message\": \""..args.error_description.."\"}") return ngx.exit(ngx.HTTP_OK) end

现在我们解决了基本的错误情况,我们要为访问令牌设置cookie。在我的例子中,cookie会在访问令牌过期前过期,所以我可以利用cookie来刷新访问令牌。

local access_token = ngx.var.cookie_SGAccessToken if access_token then ngx.header["Set-Cookie"] = "SGAccessToken="..access_token.."; path=/;Max-Age=3000" end

现在,我们解决了错误响应的api,并储存了access_token供后续访问。我们现在需要确保OAuth认证过程正确启动。下面,我们想要:

如果没有access_token已经或将要存储,开启OAuth认证

如果query string的参数中有OAuth访问代码(access code),使用OAuth API检索用户的access_token

拒绝使用非法访问代码用户的请求

Lua 的详细介绍请点这里
Lua 的下载地址请点这里

推荐阅读

Lua 语言 15 分钟快速入门

Lua程序设计(第2版)中文 PDF

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/cd2e60c00ed9a5af75a6fea44bd2201d.html