【问题标题】:How do I get an API access token dynamically for an NGINX proxy如何为 NGINX 代理动态获取 API 访问令牌
【发布时间】:2021-01-11 14:13:06
【问题描述】:

我开始尝试使用适用于 iOS 应用程序的 IGDB API。几天前,IGDB 推出了 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 请求模块触发令牌请求是否是一种合理的方法,使用 JavaScript 模块解析 JSON 响应并将响应中包含的应用访问令牌作为变量注入到代理的 HTTP 标头。虽然这在理论上对我来说听起来不错,但我几乎不知道如何实现它。此外,这种方法还不包括在令牌过期后立即存储和更新令牌。

您对我如何解决这个问题有一些提示,或者还有其他解决方案吗?

【问题讨论】:

    标签: api nginx backend nginx-reverse-proxy twitch-api


    【解决方案1】:

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

    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. 之后,脚本使用jq命令行工具解析access.json中access_token键的值,并将其保存到变量newAccessToken中。这是通过这一行完成的:

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

      cat 命令输出 access.json 并将其通过管道传递给jq 命令 过滤 access_token 键值的 json。

    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. 为了定期接收新的访问令牌,我设置了一个每天执行 shell 脚本的 cron 作业。

    不确定这是否是最优雅的解决方案,但它似乎适合我的用例并且可以正常工作。如果您有任何其他最佳实践,我很感激每一个提示。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-09
      • 2015-05-11
      • 2017-02-14
      • 1970-01-01
      • 2013-03-02
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多