IBM Cloud Docs
快速入门: Node.js Web 应用程序

快速入门: Node.js Web 应用程序

通过 App ID,您可以轻松保护 Node.js 前端 Web 应用程序。 通过本指南,您可以在 20 分钟内建立并运行简单的身份验证流程。

查看下图以了解授权代码 OAuth 2.0 工作流程。

Node.js 应用程序授权流程 应用程序流程
Node.js

  1. 用户尝试获取对受保护 Web 应用程序的访问权,但该用户未经授权。
  2. 应用程序将该用户重定向到 App ID。
  3. App ID 显示一个登录屏幕,用户可使用该屏幕进行身份验证。
  4. 用户输入其凭证,例如用户名和密码。 App ID 对凭证进行验证。
  5. App ID 使用授权代码将用户重定向回应用程序。
  6. 通过使用授权代码,应用程序向 App ID 发出请求以确保对用户进行验证。 有关获取访问令牌的更多信息,请参阅获取令牌
  7. App ID 返回已验证用户的访问令牌和身份令牌。
  8. 然后,授权用户访问应用程序。

视频教程

请查看以下视频,以了解如何使用 App ID 来保护简单的 Node.js Web 应用程序。 视频中涉及的所有信息也可以在本页中以书面形式找到。

您没有可以试用此流程的应用程序吗? 没有问题! App ID 提供了 简单 Node.js Web 样本应用程序

准备工作

在 Node.js 网络应用程序中开始使用 App ID 之前,您必须具备以下前提条件。

此 SDK 使用 log4js 包进行日志记录。 默认情况下,日志记录级别设置为 info。 要创建您自己的日志记录配置,请添加 log4js.json 文件并将 process.env.LOG4JS_CONFIG 环境变量设置为 JSON 文件。

注册重定向 URI

重定向 URI 是应用程序的回调端点。 在登录流程中,App ID 会在允许客户参与授权工作流程之前验证 URI,这有助于防止网络钓鱼攻击和授权代码泄漏。 通过注册 URI,即向 App ID 表明该 URI 是可信的,重定向您的用户没有问题。

  1. 单击管理认证 > 认证设置

  2. 添加 Web 重定向 URI 字段中,输入 URI。 每个 URI 必须以 http://https:// 开头,并且必须包含完整路径,包括任何查询参数,这样重定向才能成功。

  3. 单击添加 Web 重定向 URI 框中的 + 号。

  4. 重复步骤 1 到 3,直到将所有可能的 URI 都添加到列表中。

获取凭证

可以通过以下两种方式之一来获取凭证。

  • 导航至 App ID 仪表板的应用程序选项卡。 如果尚未具有应用程序,那么可以单击添加应用程序来创建新应用程序。

  • /management/v4/<tenantID>/applications 端点 发出 POST 请求。

     Request format:
    
     ```sh {: codeblock}
     curl -X POST \  https://us-south.appid.cloud.ibm.com/management/v4/39a37f57-a227-4bfe-a044-93b6e6060b61/applications/ \
     -H 'Content-Type: application/json' \
     -H 'Authorization: Bearer <IAMToken>' \
     -d '{"name": "ApplicationName"}'
     ```
     Example response:
    
     ```json {: screen}
     {
       "clientId": "xxxxx-34a4-4c5e-b34d-d12cc811c86d",
       "tenantId": "xxxxx-9b1f-433e-9d46-0a5521f2b1c4",
       "secret": "ZDk5YWZkYmYt*******",
       "name": "app1",
       "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/xxxxx-9b1f-433e-9d46-0a5521f2b1c4",
       "profilesUrl": "https://us-south.appid.cloud.ibm.com",
       "discoveryEndpoint": "https://us-south.appid.cloud.ibm.com/oauth/v4/xxxxxx-9b1f-433e-9d46-0a5521f2b1c4/.well-known/openid-configuration"
     }
     ```
    

初始化 SDK

使用 App ID 的最简单方法是利用 Node.JS SDK。

  1. 使用命令行来切换到包含 Node.js 应用程序的目录。

  2. 安装以下 NPM 需求。

    npm install --save express express-session passport log4js pug
    
  3. 安装 App ID 服务。

    npm install --save ibmcloud-appid
    
  4. 将以下需求添加到 server.js 文件。

    const express = require('express'); 								// https://www.npmjs.com/package/express
    const log4js = require('log4js');                                   // https://www.npmjs.com/package/log4js
    const session = require('express-session');							// https://www.npmjs.com/package/express-session
    const passport = require('passport');								// https://www.npmjs.com/package/passport
    const WebAppStrategy = require('ibmcloud-appid').WebAppStrategy;	// https://www.npmjs.com/package/ibmcloud-appid
    
  5. 通过使用在步骤 1 中获取的凭证,将应用程序设置为使用 express-session 中间件。 您可以选择通过两种方法之一来格式化重定向 URI。 手动使用新的 WebAppStrategy({redirectUri: "...."}) 或将值设置为环境变量,如示例代码中所示。

    const app = express();
    const logger = log4js.getLogger("testApp");
    app.use(session({
       secret: '123456',
       resave: true,
       saveUninitialized: true
    }));
    app.use(passport.initialize());
    app.use(passport.session());
    passport.serializeUser((user, cb) => cb(null, user));
    passport.deserializeUser((user, cb) => cb(null, user));
    passport.use(new WebAppStrategy({
       tenantId: "<tenantID>",
       clientId: "<clientID>",
       secret: "<secret>",
       oauthServerUrl: "<oauthServerURL>",
       redirectUri: "<redirectURI>"
    }));
    

    必须针对生产环境为中间件配置合适的会话存储量。 更多信息,请参阅 express.js 文档

保护应用程序

既然您已安装了 App ID,说明您已准备好保护应用程序。 您可以选择通过定义 Web 应用程序策略来保护整个应用程序或仅保护特定资源。

  1. 配置回调端点。 该回调通过从 App ID 中检索访问令牌和身份令牌,并将用户重定向到下列其中一个位置来完成授权过程:

    • 触发认证的请求的原始 URL,此 URL 持久存储在 WebAppStrategy.ORIGINAL_URL 所在的 HTTP 会话中。
    • 指定用于在认证成功时执行的重定向。
    • 应用程序根目录 (/),如下一步中所示。
    app.get(CALLBACK_URL, passport.authenticate(WebAppStrategy.STRATEGY_NAME));
    
  2. 设置一个登录端点,始终将浏览器重定向到登录 Widget。 确保添加成功重定向选项,以避免最终产生无限认证循环。

    app.get('/appid/login', passport.authenticate(WebAppStrategy.STRATEGY_NAME, {
       successRedirect: '/',
       forceLogin: true
    }));
    

个性化应用程序

可以拉取身份提供者提供的信息来个性化应用程序体验。

  1. 配置应用程序以获取用户信息。protected 是占位符变量,您可以将其更改为与应用程序的端点匹配。

    app.get("/protected_resource", passport.authenticate(WebAppStrategy.STRATEGY_NAME), function(req, res){
       res.json(req.user);
    });
    

    例如,在样本应用程序中,可以看到如何获取用户名来个性化应用程序。

    app.get('/api/user', (req, res) => {
       // console.log(req.session[WebAppStrategy.AUTH_CONTEXT]);
       res.json({
          user: {
                name: req.user.name
          }
       });
    });
    

测试配置

要测试授权配置,请导航至服务器在侦听的 URL(在应用程序中定义)。 请尝试登录,然后尝试注销。 确保配置按预期工作。

准备好移至下一步时,可以尝试启用针对 Cloud Directory 的多因子认证或添加定制属性以进一步个性化应用程序。