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 中被调用
希望对您有所帮助!
通常身份验证对 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 中被调用希望对您有所帮助!