Heroku节点+反应应用程序:未处理的锚标记身份验证请求

Posted

技术标签:

【中文标题】Heroku节点+反应应用程序:未处理的锚标记身份验证请求【英文标题】:Heroku node + react app: anchor tag auth request unhandled 【发布时间】:2018-03-10 00:33:38 【问题描述】:

我正在构建一个 node + express 服务器,前端带有 create-react-app。 我使用 passportjs 进行身份验证路由处理,所有东西都在 localhost 上运行(后端在端口 5000 上,前端在端口 3000 上,带有代理)。 当我部署到 Heroku 时,似乎服务器无法识别我的身份验证路由,因此 heroku 提供静态 index.html。 如果我用 Postman 测试我的 API 似乎一切正常(我可以看到 google oauth 的 html 页面),但是在我的反应应用程序中使用锚标记或在 url 中手动编写端点,我只能看到相同的页面重新加载。

我的服务器 index.js:

const express = require('express')
const passport = require('passport')
const mongoose = require('mongoose')
const path = require('path')

// KEYS
const keys = require('./config/keys')

// MONGOOSE MODELS
require('./models/User')

mongoose.connect(keys.mongoURI)

// PASSPORT SETUP
require('./config/passport')

// CREATE THE SERVER
const app = express()

// EXTERNAL MIDDLEWARES
require('./middlewares/external')(app)

// ROUTE HANDLERS
require('./routes/authRoutes')(app)

// PRODUCTION SETUP
if (process.env.NODE_ENV === 'production') 
  // express serve up production assets ( main.js, main.css )
  app.use(express.static('client/build'))
  app.get('*', (req, res) => 
    res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'))
  )


// START THE SERVER
const PORT = process.env.PORT || 5000
app.listen(PORT)

流程:

本地主机: react 应用程序启动 -> 我点击 'Google Login' -> GET request to "/auth/google" -> google oauth flow -> 重定向到 "/" 并且我的 react 应用程序重新出现,用户已登录。

HEROKU: 在 my-app.herokuapp.com/ 上反应应用程序 -> 点击“Google 登录” -> 页面重新加载,没有任何反应。用户未登录。

请大家帮帮我。 谢谢

【问题讨论】:

在执行 heroku logs --tail 时,您是否看到任何来自 heroku 的错误? 没有错误,似乎一切正常 我认为使用 Oauth 在他们的仪表板中有一个“重定向到的授权 URL”列表。你有重定向到那里列出的网址吗?我认为这就是他们用来重定向回您的应用的方法 我也这么认为,但是如果我用 Postman 测试我的“/auth/google” api 端点,我可以看到 google 登录 html 页面。如果有一个“授权的 URL 重定向到”,谷歌会在登录后告诉我,并带有正确的错误页面。 @DarioIelardi 似乎您遵循了 Stephen Grider 的教程,因为我遇到了同样的问题。您是否以某种方式解决了问题? 【参考方案1】:

这是默认安装 Service Worker 以使您的应用成为 Progressive Web App 的结果

要确定这是否对您来说是个问题,请在隐身模式下测试您的 heroku 生产模式应用。对 /auth/google 的请求现在应该到达服务器并像在开发中一样运行。

一旦你确定这是一个问题,你可以删除

import registerServiceWorker from "./registerServiceWorker";

来自您的 /client/src/index.js 文件。

您的浏览器缓存可能已经包含已安装的 Service Worker,因此您可能必须这样做

    清除用户浏览器上的浏览器缓存

    以编程方式卸载服务器工作者

    import  unregister  from './registerServiceWorker';
    ....
    unregister();
    

【讨论】:

非常感谢。它解决了我上周试图修复的一个错误。【参考方案2】:

我有同样的问题,症状完全相同。

对我来说,原因是键中的拼写错误:在 server/config/prod.js 中,我有一行阅读 cookieKey: process.env.COOKIE_KEY,但在 Heroku 配置变量中,该变量被命名为 cookieKey。在 Heroku 中将其重命名为 COOKIE_KEY 解决了这个问题。

【讨论】:

【参考方案3】:

如果您已按照 Stephen Grider 教程进行操作,我想知道一件事:您的 passport.js 文件是在配置还是服务中?我看到你在 index.js 中写过:require('./config/passport') 而我在 index.js 中的是require('./services/passport')

可能不是您在生产中挂起的 google oauth 流程的解决方案,但可能会有所帮助。

【讨论】:

以上是关于Heroku节点+反应应用程序:未处理的锚标记身份验证请求的主要内容,如果未能解决你的问题,请参考以下文章

Heroku节点应用程序未启动

没有 href 属性的锚标记是不是安全?

没有 href 属性的锚标记是不是安全?

节点未在 Heroku 上正确部署的 Ionic 应用程序

远程图像处理本地反应实例在 Heroku 上失败

Vue @click 不适用于存在 href 的锚标记