Koa + Passport.js 实现 Oauth2 认证

阅读时长 7 分钟读完

在前端开发中,经常需要实现用户认证和授权功能。Oauth2 是一种用于认证和授权的流行协议,它可以用来实现第三方登录和访问权限控制等功能。在本文中,我们将介绍如何使用 Koa 和 Passport.js 实现 Oauth2 认证。

什么是 Oauth2

Oauth2 是一种标准的认证和授权协议,它可以让一个应用程序通过用户授权访问另一个应用程序的资源,而不需要知道用户的用户名和密码。Oauth2 的工作流程包括四个角色:资源拥有者、客户端、授权服务器和资源服务器。具体流程如下:

  1. 客户端向资源拥有者请求授权。
  2. 资源拥有者同意授权,授权服务器向客户端颁发访问令牌。
  3. 客户端使用访问令牌向资源服务器请求资源。
  4. 资源服务器验证访问令牌并返回资源。

Oauth2 的优点是可以实现单点登录和集中化授权管理,同时确保了用户隐私和安全性。

需求分析

在本文的例子中,我们将实现一个基本的 Oauth2 认证功能,包括:

  1. 用户可以使用 GitHub 账号登录本站。
  2. 用户登录后可以访问受保护的资源。

技术方案

我们将使用 Koa 作为后端服务器,使用 Passport.js 作为认证中间件,使用 GitHub 作为认证服务提供商。以下是涉及到的技术栈:

  • Koa:流行的 Node.js Web 框架,轻量、灵活、易于扩展。
  • Passport.js:基于 Node.js 的认证中间件,支持多种认证策略。
  • GitHub OAuth2:用于 GitHub 账号登录的认证服务提供商。

实现步骤

1. 注册 GitHub Application

首先,我们需要在 GitHub 上注册一个应用程序,并获得客户端 ID 和客户端密钥。具体步骤如下:

  1. 登录 GitHub,进入 Settings。
  2. 进入 Developer settings,选择 OAuth Apps。
  3. 点击 New OAuth App,填写应用程序的基本信息。其中,注意设置 Authorization callback URL 为 http://localhost:3000/auth/github/callback,这是我们后面需要使用的回调地址。
  4. 确认应用程序信息无误后,保存已创建的应用程序,并记录下客户端 ID 和客户端密钥。

2. 安装依赖库

在开始编写代码前,我们需要安装以下依赖库:koa、koa-router、koa-session、passport、passport-github2。

3. 编写认证中间件

接下来,我们需要编写 Passport.js 的认证中间件。在 app.js 中添加以下代码:

-- -------------------- ---- -------
----- -------- - ------------------------
----- -------------- - -------------------------------------

---------------- ----------------
  --------- -----------------
  ------------- ---------------------
  ------------ ---------------------------------------------
-- ------------- ------------- -------- ----- -- -
  -- ----- ---------
  ---------- --------- -- - ------ -----------
----

----------------------------- ----- -- ---------- -------
------------------------------- ----- -- ---------- -------
展开代码

上述代码使用 GitHubStrategy 作为 Passport.js 的认证策略,并使用 GitHub 应用程序的客户端 ID 和密钥进行配置。在认证成功后,会将 GitHub 用户的信息存储在回话中,以供后面的处理使用。

4. 编写登录接口

app.js 中添加以下代码:

-- -------------------- ---- -------
----- ------ - ------------------------
----- ------- - -----------------------

-- --- ---
-------- - ------------------------
------------------- ------
-------------------------------
----------------------------

-- ------ ----
-------------------------- ------------------------------- - ------ -------------- ----
----------------------------------- ------------------------------- -
  ---------------- ----
  ---------------- ---------
----
展开代码

上述代码使用 GitHub 的认证中间件 passport.authenticate('github', { scope: ['user:email'] }) 作为登录的接口,并使用回调函数在成功或失败后进行跳转。其中,successRedirect 指定登录成功后的跳转地址,failureRedirect 指定登录失败后的跳转地址。

当用户访问 http://localhost:3000/auth/github 时,会跳转到 GitHub 进行登录认证。在认证成功后,会重定向到 http://localhost:3000/auth/github/callback,此时会调用 Passport.js 的回调函数并存储用户信息,随后将用户重定向到系统首页。

5. 添加访问控制

app.js 中添加以下代码:

-- -------------------- ---- -------
----- ------------ - ----- ----- ----- -- -
  -- ----------------------- -
    ----- -------
  - ---- -
    -----------------------
  -
--

------------------------ ------------- ----- ----- -- -
  -------- - ------ ------ ---- -- - --------- -------
---
展开代码

上述代码定义了一个中间件 requiresAuth,用于验证是否已经登录。当用户访问 /protected 时,会首先调用 requiresAuth 中间件进行认证。如果通过认证,则调用后面的处理程序,否则进行重定向。

6. 启动应用程序

app.js 中添加以下代码:

最后,启动应用程序并访问 http://localhost:3000/protected,即可进行 GitHub 账号登录并访问受保护的资源。

结束语

至此,我们在 Koa 和 Passport.js 的帮助下成功实现了 Oauth2 认证,并使用 GitHub 作为认证服务提供商。本文只是介绍了一个基本的认证例子,实际应用中可能还需要处理更多的复杂逻辑和安全问题。同时,我们也可以使用其他的认证服务提供商,如 Facebook、Google 等。这些都需要开发人员根据实际需求进行选择和扩展。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67b82442306f20b3a65ac784

纠错
反馈

纠错反馈