Next.js 在无服务器功能上使用 Auth0(使用 Passport.js)

Next.js with Auth0 (using Passport.js) on Serverless Function

通常身份验证对 auth0 和 Lock.js 来说不是什么大问题,但对 Next.js 和 SSR 来说有点棘手。根据找到的教程 (nextjs-passport),我决定尝试 passport.js。

我想将它部署到 Firebase,所以我没有可用的快速服务器。 Passport 也应该与自定义回调一起使用,但我只得到一个空白页面并且没有错误。

有人更幸运地使用最新的 Next.js 实施 Auth0 身份验证吗?

/pages/login.js

import React from 'react'

export default () => (
  <form action='/api/login' method='post'>
    <div className='field'>
      <p className='control has-icons-left has-icons-right'>
        <input className='input' name='email' type='email' placeholder='Email' />
      </p>
    </div>
    <div className='field'>
      <p className='control has-icons-left'>
        <input className='input' name='password' type='password' placeholder='Password' />
      </p>
    </div>
    <div className='field'>
      <p className='control'>
        <input type='submit' className='button is-success' />
      </p>
    </div>
  </form>
)

/pages/api/login.js

import passport from 'passport'
import Cors from 'micro-cors'

const cors = Cors({
  allowedMethods: ['POST', 'HEAD']
})

function Login (req, res, next) {
  return passport.authenticate('auth0', {
    scope: 'openid email profile',
    successRedirect: '/',
    failureFlash: true,
    failureRedirect: '/login'
  }, function (err, user, info) {
    console.log(err, user, info)
    if (err) { return next(err) }
    if (!user) { return res.redirect('/login') }
    req.logIn(user, function (err) {
      if (err) { return next(err) }
      return res.redirect('/users/' + user.username)
    })
  })(req, res, next)
}

export default cors(Login)

我假设您想在 Now V2 上使用 Nextjs,以便它是无服务器的。如果不是这样,我的回答可能对你没有帮助。

I just made a minimal repo for Auth0 and Nextjs serverless.

你意识到 Next.js Authentication Tutorial 使用 express 来扩展 Nextjs 服务器是正确的,但由于我们处于无服务器世界,身份验证需要抽象为 api。看起来你开始了,但你没有在 api 中放置一个完整的快速服务器。在我的回购协议中,我的 auth lambda 是 ./auth/auth.js。对于上面的 repo,用户数据在位于 ./utils/withAuth.js.

的 HOC 中被调用

希望对您有所帮助!