无法在 vercel 生产中验证 spotify

Posted

技术标签:

【中文标题】无法在 vercel 生产中验证 spotify【英文标题】:couldn't authenticate spotify in vercel production 【发布时间】:2022-01-12 05:21:58 【问题描述】:

我做了一个 Spotify 克隆,它有一个登录,主页。用户最初被定向到登录页面 (localhost:3000/login),一旦用户单击登录按钮,他们就会被带到 spotify 身份验证回调 url (从 spotify 端,我们可以使用 google、facebook 或电子邮件等登录),一旦用户已登录(成功通过身份验证),spotify 提供了一个令牌,用于检查用户是否从客户端进行了身份验证。如果成功,用户将被带到主页(其中包含所有音乐)。 spotify 仪表板接受重定向 url 进行身份验证,在我的例子中是 -> http://localhost:3000/api/auth/callback/spotify

此工作流程在本地工作和运行时完美运行 (localhost:3000)。

在 vercel 中托管时,

    我在没有环境的 Vercel 中创建了一个项目

    我将我的https://sp-app.vercel.app 域添加到我的环境中,并将 NEXTAUTH_URL 添加到我的环境中,还添加了 - NEXT_PUBLIC_CLIENT_SECRET、NEXT_PUBLIC_CLIENT_ID 和 JWT_SECRET

    去发现仪表板并将重定向网址编辑为https://sp-app.vercel.app/api/auth/callback/spotify并保存

    从 vercel 重新部署了应用程序(它给了我一个已部署的 url,但没关系)并单击域 --> sp-app.vercel.app

    登录页面来了,一旦我点击登录按钮,它就会加载并停留在登录页面本身。它没有移动到我的主页,也没有进行身份验证,但同样的代码在本地运行良好。

要理解的代码: 登录按钮:

providers !== null && Object.values(providers).map((provider) => (
                <div key=provider.name>
                    <button onClick=()=>signIn(provider.id, callbackUrl:"/")
                        >Login with provider.name</button>
                </div>

export async function getServerSideProps()
    const providers = await getProviders(); //getProviders is imported from next-auth

return 
    props:
        providers,
    


中间件:

export async function middleware(req)
    const token = await getToken(req,secret:process.env.JWT_SECRET);

    const pathname = req.nextUrl;

    //Allow the request if,
    // (1) Its a request for next-auth session & provider fetching
    // (2) The token exists

    if(pathname.includes('/api/auth') || token)
        return NextResponse.next();
    

    //Redirect to login if no token or requesting a protected route
    if(!token && pathname !== "/login")
        return NextResponse.redirect("/login");
    

当我使用“网络”选项卡进行检查时,我得到了一个会话,它应该让我登录并重定向到主页,但它在 Vercel 部署中不起作用。

【问题讨论】:

浏览器的控制台和/或 Vercel 的日志中是否有任何错误? @juliomalves 不 这可能会有所帮助:leerob.io/blog/spotify-api-nextjs,源代码中有一个工作示例 【参考方案1】:

您好,首先请确保您的 NEXTAUTH_URL 环境变量是正确的。还要检查重定向 URI(来自 Spotify 开发者仪表板)是否正确。

之后,将此secureCookie 代码添加到_middleware.js 文件中的getToken 函数中。所以这个函数最终应该是这样的:

const token = await getToken(
  req,
  secret: process.env.JWT_SECRET,
  secureCookie:
    process.env.NEXTAUTH_URL?.startsWith("https://") ??
    !!process.env.VERCEL_URL,
);

让我知道这是否有效。我有同样的问题,这对我有用。

【讨论】:

以上是关于无法在 vercel 生产中验证 spotify的主要内容,如果未能解决你的问题,请参考以下文章

gatsby 无法获取所有关于 vercel 生产的 graphql 数据

NextJS <Link> 在生产中不起作用(Vercel)

Python 无服务器函数 Vercel - Next.js

Vercel 中的 Next.js 与 Sentry - 在生产中忽略源映射

使用 Web API 的无浏览器身份验证

在使用 spotify api 进行用户身份验证后管理 spotify 订阅(取消、升级)