UnauthorizedError:没有授权令牌——EC2/RDS Postgres

Posted

技术标签:

【中文标题】UnauthorizedError:没有授权令牌——EC2/RDS Postgres【英文标题】:UnauthorizedError: No authorization token -- EC2/RDS Postgres 【发布时间】:2021-09-21 19:39:32 【问题描述】:

我的 node.js 应用程序在我的本地机器上运行良好(并且能够针对托管在 AWS RDS 中的远程 Postgres 数据库进行身份验证)。但是,每当我尝试将我的应用部署到运行 Ubuntu 20 的 ec2 实例时,我都会收到以下错误:

UnauthorizedError: No authorization token was found
    at middleware (/home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express-jwt/lib/index.js:76:21)
    at /home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express-unless/index.js:47:5
    at Layer.handle [as handle_request] (/home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express/lib/router/index.js:317:13)
    at /home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express/lib/router/index.js:335:12)
    at next (/home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express/lib/router/index.js:275:10)
    at serveStatic (/home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/serve-static/index.js:75:16)
    at Layer.handle [as handle_request] (/home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/home/ubuntu/[EMPLOYER]-dashboard/backend/node_modules/express/lib/router/index.js:317:13)

我已经仔细检查了 AWS 上的安全设置——我非常确信我的问题与安全策略无关。我可以使用我的 EC2 实例中的 psql 命令行工具很好地连接到数据库。在我的本地机器上,我可以通过以下方式重新创建此错误: 在前端服务器目录的 .env 文件中,我有以下行:

REACT_APP_API_HOST=http://localhost:5000

如果我在我的机器上启动开发服务器之前删除该行,那么我会得到与上面列出的完全相同的错误。有了该行,身份验证工作正常。

当然,在我的本地机器上运行应用程序时,我正在运行两台服务器:前端服务器在端口 3000 上,后端服务器在端口 5000 上。当我部署到 EC2 实例时,我只有后端服务器运行在 5000 端口——我在本地构建前端,然后通过 ftp 上传到服务器。

以下是发生错误时发送的请求和响应标头:

请求:

POST /dashboard/undefined/user/login HTTP/1.1
Host: [EC2 IP].us-west-2.compute.amazonaws.com:5000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Content-Length: 43
Origin: http://[EC2 IP].us-west-2.compute.amazonaws.com:5000
Connection: keep-alive
Referer: http://[EC2 IP].us-west-2.compute.amazonaws.com:5000/dashboard/login
Cookie: _ga=GA1.5.1312663935.1625619936; _gid=GA1.5.976208181.1626105841; _gat_gtag_UA_135473578_2=1

回复:

HTTP/1.1 401 Unauthorized
X-Powered-By: Express
Vary: Origin
Access-Control-Allow-Credentials: true
Content-Security-Policy: default-src 'none'
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Content-Length: 1354
Date: Mon, 12 Jul 2021 16:04:59 GMT
Connection: keep-alive
Keep-Alive: timeout=5

【问题讨论】:

【参考方案1】:

我的假设是您的端口“5000”是错误的。在本地环境中,您可以使用这些端口进行开发,但是当您部署到 EC2 时,默认的 http 端口是 80(对于 https 是 443)。 因此,尝试使用

更改“REACT_APP_API_HOST”值
REACT_APP_API_HOST= http://[EC2 IP].us-west-2.compute.amazonaws.com


 or  REACT_APP_API_HOST= https://[EC2 IP].us-west-2.compute.amazonaws.com  (for 443). 

如果您需要使用端口 5000,请确保将所有使用的端口(80,443,3000,5000)从您的 EC2(ELB、EBS 以防使用)添加到安全组

【讨论】:

【参考方案2】:

请检查您的请求第一行。它包含undefined

【讨论】:

以上是关于UnauthorizedError:没有授权令牌——EC2/RDS Postgres的主要内容,如果未能解决你的问题,请参考以下文章

未经授权的错误:2Checkout API

使用 HttpClient,发送没有架构的授权令牌

使用 zuul 网关时,授权服务没有使用访问令牌响应

授权代码流后,Spring OAuth2 服务器没有响应刷新令牌

Web 服务 401:未经授权的错误

UnauthorizedError:身份验证时出现 jwt 格式错误的错误