将带有 Auth0 的 React 页面部署到 Heroku 不工作
Deploy React page with Auth0 to Heroku not working
这是我第一次 post 访问 Whosebug。感谢您的精彩社区。
我想问下如何部署Auth0到Heroku
我的“HTTP://localhost:3000”上的正常行为会重定向到 Auth0 登录页面,当用户成功登录时,它会重定向回该页面。
我的带有 Auth0 的 React 应用程序在本地主机上运行非常正常,但是,当它在 Heroku 上时,它说:“找不到身份验证令牌”。显示如下:
[heroku 消息][1]
[1]: https://i.stack.imgur.com/CDO3O.png
我已经尝试使用此 link 的 Auth0 教程:https://auth0.com/docs/quickstart/spa/react/01-login,但是,即使我在 Heroku 中添加了 Auth0 插件并在 Auth0 中添加了 Heroku 的 SSO 集成,它也仅适用于本地主机。
我的 React 应用程序中的代码:
import React from "react";
import { useHistory } from "react-router-dom";
import { Auth0Provider } from "@auth0/auth0-react";
require('dotenv').config()
const Auth0ProviderWithHistory = ({ children }) => {
const domain = process.env.REACT_APP_AUTH0_DOMAIN
const clientId = process.env.REACT_APP_AUTH0_CLIENT_ID
const history = useHistory()
const onRedirectCallback = (appState) => {
history.push(appState?.returnTo || window.location.pathname)
}
return (
<Auth0Provider
domain={domain}
clientId={clientId}
redirectUri={window.location.origin}
onRedirectCallback={onRedirectCallback}
audience={process.env.REACT_APP_AUTH0_AUDIENCE}
scope={process.env.REACT_APP_AUTH0_SCOPE}
useRefreshTokens={true}
>
{children}
</Auth0Provider>
)
}
export default Auth0ProviderWithHistory
在我的 Express 服务器中:
const jwt = require('express-jwt')
const jwks = require('jwks-rsa')
var jwtCheck = jwt({
secret: jwks.expressJwtSecret({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: process.env.JWKS_URI
}),
audience: process.env.JWT_AUDIENCE,
issuer: process.env.JWT_ISSUER,
algorithms: ['RS256']
})
app.use(jwtCheck)
对于托管到 Heroku 的生产模式:
// Production mode: Heroku
if (process.env.NODE_ENV === "production"){
app.use(express.static(path.join(__dirname,"client", "build")))
app.get("*", (req, res) => {
res.sendFile(path.join(__dirname,"client", "build", "index.html"));
})
}
使用 JWTcheck 的正常 API 将是:
router.route('/delete/:id').delete(jwtCheck,async (req, res) => {
await Queue.findByIdAndDelete(req.params.id).exec((err, inventory) => {
if (err) return (err)
const response = {
message: "Successfully deleted",
id: req.params.id
}
return res.status(200).send(response)
})
})
有人可以帮忙吗:(
非常感谢。
解决方案是从 server.js 中删除它,因为 jwtCheck 功能是使用用户会话密钥保护 API,因此,在没有会话密钥的 GET 请求中将其包含在 server.js 中会显示如上的错误。
仅将上面的 jwtCheck 用于 API 保护。
不要犯我的愚蠢错误。
这是我第一次 post 访问 Whosebug。感谢您的精彩社区。 我想问下如何部署Auth0到Heroku
我的“HTTP://localhost:3000”上的正常行为会重定向到 Auth0 登录页面,当用户成功登录时,它会重定向回该页面。 我的带有 Auth0 的 React 应用程序在本地主机上运行非常正常,但是,当它在 Heroku 上时,它说:“找不到身份验证令牌”。显示如下:
[heroku 消息][1] [1]: https://i.stack.imgur.com/CDO3O.png
我已经尝试使用此 link 的 Auth0 教程:https://auth0.com/docs/quickstart/spa/react/01-login,但是,即使我在 Heroku 中添加了 Auth0 插件并在 Auth0 中添加了 Heroku 的 SSO 集成,它也仅适用于本地主机。
我的 React 应用程序中的代码:
import React from "react";
import { useHistory } from "react-router-dom";
import { Auth0Provider } from "@auth0/auth0-react";
require('dotenv').config()
const Auth0ProviderWithHistory = ({ children }) => {
const domain = process.env.REACT_APP_AUTH0_DOMAIN
const clientId = process.env.REACT_APP_AUTH0_CLIENT_ID
const history = useHistory()
const onRedirectCallback = (appState) => {
history.push(appState?.returnTo || window.location.pathname)
}
return (
<Auth0Provider
domain={domain}
clientId={clientId}
redirectUri={window.location.origin}
onRedirectCallback={onRedirectCallback}
audience={process.env.REACT_APP_AUTH0_AUDIENCE}
scope={process.env.REACT_APP_AUTH0_SCOPE}
useRefreshTokens={true}
>
{children}
</Auth0Provider>
)
}
export default Auth0ProviderWithHistory
在我的 Express 服务器中:
const jwt = require('express-jwt')
const jwks = require('jwks-rsa')
var jwtCheck = jwt({
secret: jwks.expressJwtSecret({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: process.env.JWKS_URI
}),
audience: process.env.JWT_AUDIENCE,
issuer: process.env.JWT_ISSUER,
algorithms: ['RS256']
})
app.use(jwtCheck)
对于托管到 Heroku 的生产模式:
// Production mode: Heroku
if (process.env.NODE_ENV === "production"){
app.use(express.static(path.join(__dirname,"client", "build")))
app.get("*", (req, res) => {
res.sendFile(path.join(__dirname,"client", "build", "index.html"));
})
}
使用 JWTcheck 的正常 API 将是:
router.route('/delete/:id').delete(jwtCheck,async (req, res) => {
await Queue.findByIdAndDelete(req.params.id).exec((err, inventory) => {
if (err) return (err)
const response = {
message: "Successfully deleted",
id: req.params.id
}
return res.status(200).send(response)
})
})
有人可以帮忙吗:(
非常感谢。
解决方案是从 server.js 中删除它,因为 jwtCheck 功能是使用用户会话密钥保护 API,因此,在没有会话密钥的 GET 请求中将其包含在 server.js 中会显示如上的错误。 仅将上面的 jwtCheck 用于 API 保护。 不要犯我的愚蠢错误。