【问题标题】:Getting a CORS error when trying to authenticate user with Auth0尝试使用 Auth0 对用户进行身份验证时出现 CORS 错误
【发布时间】:2020-12-25 18:58:27
【问题描述】:

编辑

Reproducible repo here

我知道这些信誉不应该出现在互联网上,但我在这里变得绝望 + 无论如何我都会删除客户端/租户。


我设置了一条路线:

router.get('/login', cors, async (req, res) => {
    try {
        console.log('Entered')
        await auth0.handleLogin(req, res)
    } catch (err) {
        return res.status(500).end()
})

Entered 行被打印,但是我一直遇到一个 cors 错误,

Access to XMLHttpRequest at 'https://dev-..' (redirected from 'http://localhost:3000/login')
 from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我已经把头发拔了好几天了。

我不确定为什么会出现错误 No 'Access-Control-Allow-Origin' header is present on the requested resource,因为我已将 cors 包添加到我的自定义 Express 服务器。

我在这里做错了什么?我关注了this tutorial,它使用了passport-auth0,我也关注了这些docs(这是上面存储库中使用的包)——两种方法都显示相同的错误。

在我的 Auth0 仪表板中,我已将允许的来源设置如下(即,我关注了this

我不知道从这里去哪里。如果我从控制台错误中手动粘贴 URL,https://dev-..,那么它会将我带到身份验证页面并成功将我重定向到 localhost:3000/

Here 是我的初始 Auth0 设置。

我在网上看到过一些类似的问题,比如this one,但是创建一个新客户对我没有帮助,其他答案也没有。我几乎浏览了 Auth0 社区论坛上的所有相关问题。

我还克隆并运行了示例 here,它与他们的页面 API 一起使用。我开始想,我不能将这个 nextjs-auth0 包与自定义服务器一起使用。

【问题讨论】:

  • 因为您将前端请求重定向到该 https://dev-.. URL,并且响应从该 URL 返回,所以仅对您的 http://localhost:3000 服务器启用 CORS 是不够的。相反,https://dev-.. 服务器也必须启用 CORS。显然不是。如果它是一个 OAuth 端点,这是正常的,并且预期它没有启用 CORS。这是因为 OAuth 端点并不意味着通过 XHR 或 Fetch 或其他方式接收脚本化的 ajax 请求。相反,用户应该被导航到端点,然后导航回来。您无法使用 XHR 导航用户。
  • 我挖得更深了,我明白你在说什么。但是,正如我在问题中所示,我已将 http://localhost:3000 设置为允许的来源 (CORS) 和允许的 Web 来源。就像我说的,我不知道从这里去哪里
  • 我之前没有在 Next.js 中尝试过这种方法,但是 auth0 可以与其他几个 JS 框架一起使用,没有太多问题。我猜想如何重定向到 auth0 登录页面存在问题。基本上它不应该在登录时发出 CORS 请求,它应该将整个浏览器发送到 auth0 域以登录,然后将客户端发送回令牌。我已经克隆了你的仓库,奇怪的是 handleLogin 方法没有向浏览器返回 302。
  • 真正困扰我的是,我查看了他们的examples,自己克隆了它们,并让它们轻松工作。我能注意到的唯一区别是我使用自定义服务器来处理登录,而他们使用的是他们的页面 API。 This 示例也很奇怪,因为它也使用自定义服务器,但它不进行任何身份验证,只是授权,如果我没看错的话。不知道从这里去哪里。
  • 我认为问题出在“处理登录的自定义服务器”中。第二个示例是资源服务器 - 所以这是一个使用访问令牌允许 authn/z 访问 API 的后端。问题是您如何获取令牌 - 您的 UI 需要执行 302 重定向到 auth0 登录页面(不使用 XHR),允许 auth0 处理所有登录过程(可以包括注册、2fa 等)然后它将重定向使用令牌返回您的应用

标签: cors next.js auth0


【解决方案1】:

您不是使用浏览器重定向,而是发送异步请求,这就是 Auth0 不适合您并给您 CORS 错误的原因。

使用以下代码更新您的 Home 视图,它将解决您的问题:

import React from 'react';
import axios from 'axios';

export default function Home() {
    return (
        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
            <a href='/login'>login</a>
        </div>
    );
}

P.S:我通过 fork 你的 repo 尝试了这个更改,它按预期工作,如果你仍然看到问题,请告诉我。

【讨论】:

  • 这行得通。只是想确认一下,无论我在后端拥有哪条路线,在这种情况下为/login,都可以通过简单的` 标签访问?这是nextjs的事情吗?我不记得 ReactJS 与 Express 后端的行为方式相同。
  • 不是真的,它不是 nextjs 的东西,但它是 OAuth 隐式授权规范的一部分,我猜。根据经验,所有可能导致重定向响应的请求(响应中的位置标头)都应该直接通过浏览器发生。即使您可以像以前一样保持处理程序,但不是调用端点异步,您必须调用 window.location=newUrl。
  • 肯定有办法解决这个问题,但这是最简单的方法。
  • 你可以在 axios 上关注这个帖子,如果目前没有,可能会在未来某个时候找到你正在寻找的答案:github.com/axios/axios/issues/932
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2018-01-26
  • 2019-09-30
  • 2019-12-21
  • 2013-05-23
相关资源
最近更新 更多