将 Oauth 2.0 与 Next js 一起使用

Posted

技术标签:

【中文标题】将 Oauth 2.0 与 Next js 一起使用【英文标题】:Using Oauth 2.0 with Next js 【发布时间】:2019-11-07 05:27:38 【问题描述】:

我想在我的 React/Next.js 应用中使用 Google OAuth 2.0。我已经在 Google Developer 控制台上设置了我的 OAuth 客户端 ID,并在我的 server.js 节点文件中设置了一个路由。当我尝试 GET 请求 https://localhost:3000/auth/google 时,我得到 Next js 404 Not Found 页面。它显然是在我的 Next js pages 目录中寻找一个名为 auth 的页面。尝试使用下一个/路由器,将我的按钮包装在一个锚元素中,获取 API GET 请求https://localhost:3000/auth/google,都失败了。

我已经成功地实现了护照用户身份验证、加盐、散列和会话,但给我带来麻烦的只是 Oauth。

如果它是标准节点应用程序https://localhost:3000/auth/google 将重定向到用户可以使用他们的谷歌凭据登录的界面。

我已尝试在 nextjs 示例 github 中搜索 oauth 的实现,但似乎没有。有人知道我如何将 OAuth 2.0 与 Next JS 一起使用吗?

路线

server.get("/auth/google", (req, res) =>
   passport.authenticate("google",  scope: ['profile']);
)

应该把我带到谷歌登录/注册页面的按钮

<button className="btn btn-block btn-social btn-google" style='color': '#fff' onClick=() => Router.push("/auth/google")>
<FontAwesomeIcon icon=faGoogle className="google-social-button" /> Sign Up with Google
</button>

【问题讨论】:

【参考方案1】:

你可以试试这个,

const app = next( dev );
const server = express()

server.get('/auth/google/callback*',
    passport.authenticate('google'),
(req, res) => 
    res.redirect('/dashboard');
);

server.get('/auth/google*', (req, res) => 
    return app.render(req, res, req.path, req.query)
);

server.get('/api/logout', (req, res) => 
    req.logout();
    res.send(req.user);
)

server.get('/api/current_user', (req, res) => 
    res.send(req.user);
);

server.get('*', (req, res) => 
   return handle(req, res)
);

只要确保 google reqs 位于 server.get('*') 路由之上,因为它会捕获所有请求。 更多帮助:https://github.com/zeit/next.js/blob/canary/examples/custom-server-express/server.js

【讨论】:

【参考方案2】:

不确定您是否还在此处寻找答案,但如果是,您可以在最新的 Next.js 版本 (9+) 下执行类似以下操作,https://nextjs.org/blog/next-9#api-routes

//--- 第 1 部分:定义您的 GOOGLE OAUTH 策略 ALA 护照 // 这将在它自己的 passport.js 文件中(文件名无关紧要),关键是你定义了你的谷歌策略

import passport from 'passport'
import 
  Strategy as GoogleStrategy,
 from 'passport-google-oauth20'

passport.use(new GoogleStrategy(
  ...getGoogleKeySecret(), // a utility for grabbing your secret keys
  callbackURL: `/api/authorize/google/callback`,
  passReqToCallback: true, // http://www.passportjs.org/docs/authorize/
, async function(req, accessToken, refreshToken, profile, done) 
    // Do any user lookup/mapping you need here
    return done(null, profile)
))

//--- 第 2 部分:定义端点 // 这将在您的 pages/api/auth/google.js 文件中

import nextConnect from 'next-connect'
import middleware from '../any/custom/middleware/stuff/you/may/have'

const handler = nextConnect()

handler.use(middleware)

handler.get(passport.authenticate("google", 
  scope: ['profile', 'email', 'openid'], // tailer the scope to fit your needs
))

export default handler

要试用它,请通过您的 UI 将用户引导至 /api/auth/google 或直接点击 URL,您应该会被引导通过 Google OAuth 2.0 流程。

希望这会有所帮助 - 祝你好运!

【讨论】:

以上是关于将 Oauth 2.0 与 Next js 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

python 有关如何将Flask与requests-oauthlib一起使用以使用OAuth 2令牌获取GitHub用户配置文件的示例。

python 有关如何将Flask与requests-oauthlib一起使用以使用OAuth 2令牌获取GitHub用户配置文件的示例。

将 react redux 与 next.js 一起使用

将 reactstrap 与 Next.js 一起使用

OAuth 2.0 游乐场:未授权客户端

有没有办法将 Materialize CDN 与 Next.js 一起使用?