RESTful API 使用 OAuth2 进行认证授权

在前端开发中,RESTful API 是一种非常常见的接口设计方式,而 OAuth2 认证授权机制则是一种较为安全、有效的接口认证方式。本文将详细介绍如何在 RESTful API 中使用 OAuth2 进行认证授权,实现安全可靠的接口访问。

OAuth2 简介

OAuth2 是一种基于授权的开放标准协议,用于授权第三方应用访问用户资源。它允许用户从第三方应用中选择授权,而不是将用户名和密码直接提供给第三方应用。

OAuth2 被广泛用于实现微信、QQ、微博等第三方登录,也是一些流行的云服务平台如 Google、Microsoft Azure 等所采用的认证授权机制。

OAuth2 标准协议主要包括:

  • 授权码流程(Authorization Code Flow)
  • 密码流程(Password Grant Flow)
  • 客户端凭证流程(Client Credentials Flow)

本文以授权码流程为例进行介绍。

授权码流程

授权码流程是最为安全且最适用于 Web 应用程序的认证流程。其主要步骤如下:

  1. 应用程序将用户导向认证服务器 (Authorization Server),并申请授权。

  2. 用户同意授权,并在认证服务器上完成登录。

  3. 认证服务器将用户重定向回应用程序,同时附带一个授权码(Authorization Code)。

  4. 应用程序使用授权码向认证服务器请求身份令牌(Access Token)。

  5. 认证服务器验证授权码的有效性,如果有效则向应用程序发送身份令牌。

  6. 应用程序使用身份令牌请求用户资源。

  7. 用户资源服务器向应用程序返回用户资源。

其中,步骤 1 是通过重定向用户浏览器来实现的,因此需要指定一个重定向 URI。重定向 URI 可以是应用程序的一个特殊网页,该网页将收到包含授权码的服务器响应。

步骤 2 和 3 一般由认证服务器自动完成。

步骤 4 和 5 需要应用程序向认证服务器发送请求,因此需要应用程序的凭证(Client ID 和 Client Secret)。

步骤 6 和 7 中,应用程序需要使用身份令牌才能请求用户资源。身份令牌通常在 HTTP 头中发送,并使用 Bearer 类型指定。

OAuth2 实现

下面通过一个示例来演示如何在 RESTful API 中使用 OAuth2 进行认证授权。我们假定:

  • 认证服务器采用 Spring Boot OAuth2
  • 应用程序使用 Node.js + Express
  • 用户资源服务器采用 MongoDB 作为数据库

认证服务器

首先我们需要搭建认证服务器,并定义 RESTful API 接口。

pom.xml

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

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

application.yml

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

AuthorizationServerConfiguration.java

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

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

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

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

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

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

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

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

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

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

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

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

MongoUserDetailsService.java

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

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

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

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

应用程序

然后我们需要搭建应用程序,并使用 oauth2orize 库实现 OAuth2 认证授权。

package.json

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

server.js

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

用户资源服务器

最后我们需要搭建用户资源服务器,并定义 RESTful API 接口。

package.json

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

server.js

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

测试

现在我们完成了 OAuth2 认证授权的搭建,可以开始测试了。

  1. 启动认证服务器:mvn spring-boot:run
  2. 启动应用程序服务器:node server.js
  3. 启动用户资源服务器:node server.js
  4. 访问应用程序:http://localhost:3000,输入用户名和密码进行登录。
  5. 点击 "Authorize" 按钮授权。
  6. 按照如下方式访问受保护资源:
  • 成功:curl http://localhost:4000/protected -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
  • 失败:curl http://localhost:4000/protected

可以看到,访问受保护资源时需要使用先前获取的访问令牌。如果访问令牌未过期且有效,则可以成功访问资源。否则,将收到未经授权的响应。

总结

本文详细介绍了如何在 RESTful API 中使用 OAuth2 进行认证授权。通过该认证授权机制,可以构建安全可靠的接口访问,保护用户数据免受恶意攻击。该方法不仅简单易懂,而且广泛适用于各种应用场景,是 RESTful API 开发中不可或缺的必要技术。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65409ec07d4982a6eba22ba6


猜你喜欢

  • 在使用 Enzyme 进行测试时,如何模拟 fetch API?

    在前端开发中,我们经常需要使用 fetch API 来进行网络请求。当我们要对使用了 fetch API 的组件进行单元测试时,需要模拟 fetch API 的行为,以保证测试的准确性和完整性。

    1 年前
  • 如何解决在 LESS 中 import 多个样式文件导致页面加载缓慢

    在前端开发中,我们常常使用 LESS 进行 CSS 的预处理工作。但是,当项目变得越来越庞大,LESS 文件也会随之增多,当我们将多个样式文件通过 import 引入后,会导致页面加载变慢。

    1 年前
  • 用 Redis 解决高并发场景下的数据一致性问题

    背景 在高并发场景下,由于多个请求同时修改同一数据,会出现数据不一致的情况。比如,在一个电商网站上,如果同时有多个用户购买同一商品,可能会出现库存不足的问题。为了避免这种情况,我们需要实现数据一致性。

    1 年前
  • 在 Koa.js 中使用 Swagger 构建 API 文档

    前言 在现代的互联网应用中,API 文档变得越来越重要。它不仅作为开发者了解和使用 API 的重要工具,还可以为不同部门之间的沟通提供便利。API 文档的编写一直是非常耗时的工作,有时候一个 API ...

    1 年前
  • 使用 Socket.io 实现实时地理位置共享

    在现代互联网中,地理位置服务已经成为了一个不可或缺的功能,无论我们是为了找出附近的商家,还是为了更好地排定一个旅游路线,都需要涉及到位置信息的共享功能。在前端开发中,通过使用 Socket.io,我们...

    1 年前
  • Material Design 中 Card 组件的使用技巧

    Material Design 是 Google 推出的一种新的设计语言,它帮助开发人员创建高质量、美观、易于使用且一致的应用程序,更重要的是,它是一个开源的设计系统,任何人都可以在其基础上开发和改进...

    1 年前
  • 在 React Native 应用中使用 TypeScript 的好处

    在前端开发中,TypeScript 是一种非常实用的静态类型语言。当应用规模增大时,TypeScript 可以提供更好的可维护性和代码安全性。React Native 开发中,使用 TypeScrip...

    1 年前
  • 如何在 Cypress 中进行接口 Mock 测试

    在前端开发中,我们常常需要对接口进行测试,而在测试接口时,我们常常希望能够尽量减少与后端的耦合性,而接口 Mock 测试就可以帮助我们实现这一目标。本文将介绍如何在 Cypress 中进行接口 Moc...

    1 年前
  • Fastify 应用中的数据分页技巧

    在日常的 Web 应用中,我们往往需要处理大量的数据。而当这些数据量变得非常大时,我们就必须对它们进行分页处理,以提高数据的加载速度和应用的性能。而对于 Fastify 应用来说,有一些技巧可以帮助我...

    1 年前
  • 如何处理 Mongoose 中的时间戳

    在使用 MongoDB 和 Mongoose 进行 Web 开发时,处理时间戳是非常重要的一个问题。时间戳是指某个事件发生的时间,通常表示成一个整数或浮点数。在 Mongoose 中,时间戳是一个 D...

    1 年前
  • 通过 Gulp 实现 SPA 应用打包优化

    单页应用(SPA)的出现使得前端应用变得更加快速和流畅,但是随着业务代码的增长,打包后的体积也越来越大,导致加载时间变长,影响用户体验。针对这个问题,我们可以使用 Gulp 来进行打包优化。

    1 年前
  • 如何实现适用于 Web Components 的 CSS 组件库

    在现代的 Web 应用中,使用组件化的编程方式可以减少代码的重复使用。Web Components 开始得到越来越多的支持,它可以帮助我们实现可重用并可组合的 UI 组件。

    1 年前
  • SASS 注释的使用方法及其注意点

    在前端开发中,注释是非常重要的一个工具。注释可以帮助我们梳理代码逻辑,增加代码可读性,有助于后期维护和修改。SASS 作为一种 CSS 预处理器,也提供了一些注释功能,本文将深入介绍 SASS 注释的...

    1 年前
  • RxJS 中的 last 操作符详解

    RxJS 是一种函数响应式编程框架,它是 JavaScript 中处理异步流数据的最佳选择之一。RxJS 提供了许多操作符,其中常用的操作符之一是 last 操作符。

    1 年前
  • 如何在 Chai 中测试对象是否为空

    在前端开发中,测试是不可或缺的一环。而 Chai 是一个非常流行的 JavaScript 测试库,可以在 Node.js 和浏览器环境中使用。本文将介绍如何在 Chai 中测试对象是否为空。

    1 年前
  • Promise 异步编程与单线程模型

    什么是 Promise Promise 是一种基于回调函数的解决方案。它使得异步代码可以像同步代码一样编写,同时避免了回调地狱的情况。Promise 最初是作为 ECMAScript 6 规范的一部分...

    1 年前
  • Serverless 可以做的跨语言调用

    简介 Serverless 架构已经成为了现代化 Web 应用开发的一种非常流行的方式。它通过使用云服务提供商(如 Amazon Web Services、Microsoft Azure、Google...

    1 年前
  • ES11 新特性之 globalThis,为 JavaScript 取消全局对象提供了指导

    在 JavaScript 中,全局对象是一个非常重要的概念,所有的全局变量和函数都存在于它的命名空间中。而 ES11 新引入的 globalThis 对象为 JavaScript 取消了全局对象提供了...

    1 年前
  • Sequelize 的同步和异步操作详解

    在进行后端开发时,我们经常需要与数据库进行交互。Sequelize 是一个支持多种数据库(如 MySQL、PostgreSQL、SQLite、MariaDB 等)的 ORM 框架。

    1 年前
  • Express.js 中的 Service Layer 设计方案

    在前端应用的开发中,Service Layer 设计方案被广泛应用于后端服务的设计中。Service Layer 是前端向后端发起请求的中间层,将请求参数封装并调用后端服务,同时还负责处理服务返回的结...

    1 年前

相关推荐

    暂无文章