如何动态获取NGINX代理的API访问令牌

问题描述

我开始使用iOS应用程序的IGDB API。几天前,IGDB推出了V4,该V4现在需要通过oAuth2向Twitch进行授权才能接收应用访问令牌。

凭借对后端的了解(我昨天刚开始学习NGINX),我设法建立了一个NGINX Web服务器,该服务器代理对IGDB API的请求,并将应用程序访问令牌注入HTTP标头。目前,此功能正常。

nginx.conf中包含的我的proxy.conf看起来像这样:

server {
    listen 443 ssl;
    server_name myhost.com;

    #SSL Config cut out  
    ...

    location / {
        proxy_pass https://api.igdb.com/v4/games;
        proxy_ssl_server_name on;
        proxy_set_header Client-ID "MY TWITCH APP CLIENT ID";
        proxy_set_header Authorization "Bearer THE_APP_ACCESS_TOKEN";
    }
}

但是我手动请求了THE_APP_ACCESS_TOKEN。出于测试目的,这很好,但是它将在约60天后过期(根据Twitch开发文档)。我现在想知道如何动态地请求访问令牌(并以某种方式存储它?),在令牌过期时刷新它并将其注入proxy.conf。

在进行研究时,我偶然发现HTTP Auth Request模块与NGINX JavaScript模块(https://www.nginx.com/blog/validating-oauth-2-0-access-tokens-nginx/)相结合。

现在,我想知道在代理请求之前通过Auth Request Module触发令牌请求,使用JavaScript模块解析JSON响应并将响应中包含的应用访问令牌作为变量注入到javascript中是否是一种合理的方法。代理的HTTP标头。尽管从理论上讲这对我来说听起来不错,但我几乎不知道如何实现这一点。而且,这种方法还不包括令牌过期后立即存储和更新。

您对我有什么提示,如何解决?还是有其他解决方案?

解决方法

好的,这就是我的想法。这似乎适合我的用例:

  1. 我编写了一个Shell脚本,该脚本向twitch oAuth端点发出一个curl POST请求,以获取应用访问令牌,并将JSON响应输出到文件(此处为access.json)

    curl -o access.json -X POST 'https://id.twitch.tv/oauth2/token?client_id=<YOUR_CLIENT_ID>&client_secret=<YOUR_CLIENT_SECRET>&grant_type=client_credentials'

  2. 然后,脚本使用access_token命令行工具解析access.json中的jq键的值,并将其保存到变量newAccessToken中。这是通过以下行完成的:

    newAccessToken=$(cat /<PATH_TO_JSON>/access.json | jq -r '.access_token')

    cat命令输出access.json并将其通过管道传递到jq命令 会为JSON过滤access_token键值。

  3. 在脚本的同一目录中,我放置了一个proxy_template.conf,它包含上面的所有配置信息,但是它不是字符串,而是由手动输入的访问令牌“ THEACCESSTOKEN”。

  4. access_token密钥存储在newAccessToken变量中后,我在proxy_template.conf中搜索“ THEACCESSTOKEN”字符串,将其替换为newAccessToken变量的值并保存输出在proxy.conf目录中的新/etc/nginx/conf.d中。这是通过sed命令完成的:

    sed "s/THEACCESSTOKEN/$newAccessToken/g" /<PATH_TO_FILE>/proxy_template.conf > /nginx/etc/conf.d/proxy.conf

  5. 在脚本的最后一行中,我只是nginx -s reload服务器以使用新的配置文件。

  6. 为了定期接收新鲜的访问令牌,我设置了一个cron作业,该作业每天执行一次shell脚本。

不确定这是否是最优雅的解决方案,但对于我的用例而言,它似乎可以正常工作。如果您有其他最佳做法,我将不胜感激。 :)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...