如何解决 heroku 和 okta 之间的端口问题?
how to solve port issue between heroku and okta?
我有一个使用 okta 服务进行身份验证的 nodejs 应用程序。
我在我的电脑上本地测试的应用程序运行正常,它开始监听端口 3000:
const port = process.env.PORT || 3000
app.listen(port, () => console.log(`App listening on port ${port}`))
到目前为止一切顺利。
下一步我在 heroku 上部署了该应用程序,但是 - 不幸的是 - 它不起作用......
我检查了日志文件并找到了罪魁祸首:heroku 似乎忽略了我在 .env 文件中设置为 3000 的端口,并且它使用端口的(随机?)值,例如 16709:
2020-04-17T09:51:40.261031+00:00 app[web.1]: App listening on port
16709
这就解释了身份验证失败的原因。
正如我在 okta 设置中看到的那样,它肯定需要端口 3000:
Login redirect URIs : http://localhost:3000/authorization-code/callback
所以我被卡住了...我搜索了 Whosebug 并找到了这个:How login with okta oauth in new heroku app,但不幸的是没有答案:(
拜托,有人知道如何mitigate/solve heroku 和 okta 之间的端口问题吗?
更新:
我尝试了下面的答案和评论中的建议,但它仍然不起作用...
我从 okta auth 得到的是:
"400 - bad request. You request resulted in an error. Identityy
provider: Unknown. Error code: invalid_request."
这里是 okta 的一些日志:
Outcome
Reason mismatched_redirect_uri
Result FAILURE
Severity WARN System
DebugContext
DebugData
AuthCode <removed by me>
AuthorizationServer <removed by me>
AuthorizationServerName default
ClientAuthType client_secret_basic
GrantType authorization_code
GrantedScopes
RedirectUri https://my_app.herokuapp.com//authorization-code/callback
RequestId <removed by me>
RequestUri /oauth2/default/v1/token
RequestedScopes
ThreatSuspected false
Url /oauth2/default/v1/token?
LegacyEventType app.oauth2.as.token.grant_failure
app Heroku 在内部设置了一个随机端口,但将您的应用程序暴露给标准 https 端口 (443) 上的 public。因此,如果您在 heroku 上有一个名为:nodejs-okta 的应用程序,public可访问的 url 将是:
https://nodejs-okta.herokuapp.com
您需要在 okta 应用程序设置中将此 url 列入白名单,以便重定向正常工作:
https://nodejs-okta.herokuapp.com/authorization-code/callback
注意:我在 Okta 的开发者宣传团队工作
好吧,通过检查您的 okta 日志,您的重定向中似乎有一个额外的“/”URL。
这绝对是“mismatched_redirect_uri”失败的主要原因。
请更改此(注意:authorization-code
前的双斜杠):
RedirectUri = https://my_app.herokuapp.com//authorization-code/callback
用这个(注意:authorization-code
前的单斜杠):
RedirectUri = https://my_app.herokuapp.com/authorization-code/callback
经过上述更正后,只需尝试重做所有测试(登录、身份验证等)。
我 99% 确定这会解决您的问题。
我有一个使用 okta 服务进行身份验证的 nodejs 应用程序。
我在我的电脑上本地测试的应用程序运行正常,它开始监听端口 3000:
const port = process.env.PORT || 3000
app.listen(port, () => console.log(`App listening on port ${port}`))
到目前为止一切顺利。
下一步我在 heroku 上部署了该应用程序,但是 - 不幸的是 - 它不起作用......
我检查了日志文件并找到了罪魁祸首:heroku 似乎忽略了我在 .env 文件中设置为 3000 的端口,并且它使用端口的(随机?)值,例如 16709:
2020-04-17T09:51:40.261031+00:00 app[web.1]: App listening on port 16709
这就解释了身份验证失败的原因。
正如我在 okta 设置中看到的那样,它肯定需要端口 3000:
Login redirect URIs : http://localhost:3000/authorization-code/callback
所以我被卡住了...我搜索了 Whosebug 并找到了这个:How login with okta oauth in new heroku app,但不幸的是没有答案:(
拜托,有人知道如何mitigate/solve heroku 和 okta 之间的端口问题吗?
更新:
我尝试了下面的答案和评论中的建议,但它仍然不起作用...
我从 okta auth 得到的是:
"400 - bad request. You request resulted in an error. Identityy provider: Unknown. Error code: invalid_request."
这里是 okta 的一些日志:
Outcome
Reason mismatched_redirect_uri Result FAILURE
Severity WARN System
DebugContext DebugData AuthCode <removed by me> AuthorizationServer <removed by me> AuthorizationServerName default ClientAuthType client_secret_basic GrantType authorization_code GrantedScopes RedirectUri https://my_app.herokuapp.com//authorization-code/callback RequestId <removed by me> RequestUri /oauth2/default/v1/token RequestedScopes ThreatSuspected false Url /oauth2/default/v1/token? LegacyEventType app.oauth2.as.token.grant_failure
app Heroku 在内部设置了一个随机端口,但将您的应用程序暴露给标准 https 端口 (443) 上的 public。因此,如果您在 heroku 上有一个名为:nodejs-okta 的应用程序,public可访问的 url 将是:
https://nodejs-okta.herokuapp.com
您需要在 okta 应用程序设置中将此 url 列入白名单,以便重定向正常工作:
https://nodejs-okta.herokuapp.com/authorization-code/callback
注意:我在 Okta 的开发者宣传团队工作
好吧,通过检查您的 okta 日志,您的重定向中似乎有一个额外的“/”URL。
这绝对是“mismatched_redirect_uri”失败的主要原因。
请更改此(注意:authorization-code
前的双斜杠):
RedirectUri = https://my_app.herokuapp.com//authorization-code/callback
用这个(注意:authorization-code
前的单斜杠):
RedirectUri = https://my_app.herokuapp.com/authorization-code/callback
经过上述更正后,只需尝试重做所有测试(登录、身份验证等)。
我 99% 确定这会解决您的问题。