IBM Cloud Docs
Web 应用程序

Web 应用程序

开发 Web 应用程序时,可以使用 IBM Cloud® App ID Web 流程来安全地认证用户。 然后,用户就可以在 Web 应用程序中访问服务器端受保护的内容。

了解流程

Web 应用程序通常要求用户进行认证以访问受保护的内容。App ID 使用 OIDC 授权代码流来安全地认证用户。 通过此流程,在认证用户时,应用程序会收到授权代码。 然后,会使用此代码来交换访问令牌、身份令牌和刷新令牌。 在代码中,令牌的交换步骤始终通过应用程序和 OIDC 服务器之间的安全后端通道发送。 由于攻击者无法截获令牌,因此这一过程提供了另一层安全保障。 可以将这些令牌直接发送到托管应用程序的 Web 服务器以进行用户认证。

网络应用程序请求流程
网络应用程序请求流程

  1. 用户通过 App ID SDK 或 API 向 /authorization 端点发送请求,以启动授权流程。

  2. 如果用户未获授权,那么启动的认证流程会重定向到 App ID。

  3. 根据用户的 /authorization 请求参数或身份提供者配置,将在用户的浏览器中启动登录窗口小部件。

  4. 用户选择身份提供者以进行认证并完成登录过程。

  5. 身份提供者使用授权代码重定向到客户端应用程序。

  6. App ID SDK 使用授权代码来交换来自 App ID 服务的访问令牌、身份令牌和可选的刷新令牌。

  7. 令牌由 App ID SDK 保存,然后重定向到客户端应用程序。

  8. 授权用户访问应用程序。

配置 Node.js SDK

可以将 App ID 配置为使用 Node.js Web 应用程序。

准备工作

您必须满足以下先决条件:

  • App ID 服务的实例
  • 一组服务凭证
  • NPM V4 或更高版本
  • Node V6 或更高版本
  • 在 App ID 服务仪表板中设置的重定向 URI

请查看以下视频,以了解有关使用 App ID 来保护 Node 应用程序的信息。 然后,使用 简单的 Node 示例应用程序亲自尝试一下。

安装 Node.js SDK

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

  2. 安装 App ID 服务。

    npm install --save ibmcloud-appid
    

初始化 Node.js SDK

  1. 将以下 require 定义添加到 server.js 文件。

    const express = require('express');
    const session = require('express-session')
    const passport = require('passport');
    const WebAppStrategy = require("ibmcloud-appid").WebAppStrategy;
    const CALLBACK_URL = "/ibm/cloud/appid/callback";
    
  2. 将 express 应用程序设置为使用 express-session 中间件。

    const app = express();
    app.use(session({
       secret: "123456",
       resave: true,
       saveUninitialized: true
    }));
    app.use(passport.initialize());
    app.use(passport.session());
    

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

  3. 通过以下其中一种方式获取凭证。

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

    • 通过向 /management/v4/<tenantId>/applications 端点发出 POST 请求。

      请求格式:

      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"}'
      

      示例响应:

      {
      "clientId": "111c22c3-38ea-4de8-b5d4-338744d83b0f",
      "tenantId": "39a37f57-a227-4bfe-a044-93b6e6060b61",
      "secret": "ZmE5ZDQ5ODctMmA1ZS00OGRiLWExZDMtZTA1MjkyZTc4MDB4",
      "name": "ApplicationName",
      "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/39a37f57-a227-4bfe-a044-93b6e6060b61"
      }
      
  4. 可选:决定如何设置重定向 URI 的格式。 重定向的格式可以通过两种不同方式进行设置。 如果未提供以下选项,App ID SDK 会尝试检索运行在 IBM Cloud 上的应用程序的 application_uri,并附加默认后缀 /ibm/cloud/appid/callback

    • 手动在新的 WebAppStrategy({redirectUri: "...."})
    • 设置为名为 redirectUri 的环境变量
  5. 使用先前步骤中获取的信息来初始化 SDK。

    passport.use(new WebAppStrategy({
    tenantId: "<tenantID>",
    clientId: "<clientID>",
    secret: "<secret>",
    oauthServerUrl: "<oauthServerURL>",
    redirectUri: "<appURL>" + CALLBACK_URL
    }));
    
  6. 为 Passport 配置序列化和反序列化。 为了实现跨 HTTP 请求的认证会话持久性,此配置步骤是必需的。 更多信息,请参阅 护照文档

    passport.serializeUser(function(user, cb) {
       cb(null, user);
       });
    passport.deserializeUser(function(obj, cb) {
       cb(null, obj);
       });
    
  7. 将以下代码添加到 server.js 文件以发出服务重定向。

    app.get(CALLBACK_URL, passport.authenticate(WebAppStrategy.STRATEGY_NAME));
    
  8. 通过将以下代码片段添加到 app.js 文件中来注册受保护端点。

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

有关更多信息,请参阅 App ID Node.js GitHub 存储库

配置 Liberty for Java SDK

可以将 App ID 配置为与 Liberty for Java Web 应用程序一起运作。

准备工作

您必须满足以下先决条件:

  • App ID 服务的实例
  • 一组服务凭证
  • Apache Maven 3.5 或更高版本
  • Java 1.8
  • Liberty for Java Web 应用程序

请查看以下视频,以了解有关使用 App ID 来保护 Liberty for Java 应用程序的信息。 然后,使用 简单的 Liberty for Java 示例应用程序亲自尝试一下。

安装 Liberty for Java SDK

  1. server.xml 添加 OpenID Connect 功能。

    <featureManager>
       <feature>ssl-1.0</feature>
       <feature>appSecurity-2.0</feature>
       <feature>openidConnectClient-1.0</feature>
    </featureManager>
    
  2. 通过以下两种方式之一来获取凭证。

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

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

      请求格式:

      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"}'
      

      示例响应:

      {
      "clientId": "111c22c3-38ea-4de8-b5d4-338744d83b0f",
      "tenantId": "39a37f57-a227-4bfe-a044-93b6e6060b61",
      "secret": "ZmE5ZDQ5ODctMmA1ZS00OGRiLWExZDMtZTA1MjkyZTc4MDB4",
      "name": "ApplicationName",
      "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/39a37f57-a227-4bfe-a044-93b6e6060b61"
      }
      
  3. 创建 OpenID Connect 客户端功能,并定义以下占位符。 使用服务凭证来填充占位符。

    <openidConnectClient
       clientId='App ID client_ID'
       clientSecret='App ID Secret'
       authorizationEndpointUrl='oauthServerUrl/authorization'
       tokenEndpointUrl='oauthServerUrl/token'
       jwkEndpointUrl='oauthServerUrl/publickeys'
       issuerIdentifier='Changed according to the region'
       tokenEndpointAuthMethod="basic"
       signatureAlgorithm="RS256"
       authFilterid="myAuthFilter"
       trustAliasName="ibm.com"
    />
    
    Liberty for Java 应用程序的 OIDC 元素变量
    组件 描述
    clientID
    secret
    oauth-server-url
    完成步骤 2 以获取服务凭证。
    authorizationEndpointURL oauthServerURL 的末尾添加 /authorization
    tokenEndpointUrl

    oauthServerURL 的末尾添加 /token

    jwkEndpointUrl oauthServerURL 的末尾添加 /publickeys
    issuerIdentifier 发行人标识符的格式如下:&lt;region>&gt;.cloud.ibm.com。 了解有关 可用区域 的更多信息。
    tokenEndpointAuthMethod 被指定为“basic”。
    signatureAlgorithm 被指定为“RS256”。
    authFilterid 要保护的资源的列表。
    trustAliasName 信任库中证书的名称。

初始化 Liberty for Java SDK

  1. server.xml 文件中,定义授权过滤器以指定受保护资源。 如果未 定义过滤器,那么服务将保护所有资源。

    <authFilter id="myAuthFilter">
       <requestUrl id="myRequestUrl" urlPattern="/protected_resource" matchType="contains"/>
    </authFilter>
    
  2. 将特殊主体类型定义为 ALL_AUTHENTICATED_USERS

    <application type="war" id="ProtectedServlet" context-root="/appidSample" location="${server.config.dir}/apps/libertySample-1.0.0.war">
       <application-bnd>
             <security-role name="myrole">
                <special-subject type="ALL_AUTHENTICATED_USERS"/>
             </security-role>
       </application-bnd>
    </application>
    
  3. 下载 libertySample-1.0.0.war 文件 GitHub 下载 文件,并将其放到服务器的应用程序文件夹中。 例如,如果服务器名为 defaultServer,那么该 WAR 文件将位于以下位置:target/liberty/wlp/usr/servers/defaultServer/apps/

  4. 通过将以下内容添加到 server.xml 文件来配置 SSL。 您还需要创建信任库。

       <keyStore id="defaultKeyStore" password="myPassword"/>
       <keyStore id="appidtruststore" password="Liberty" location="${server.config.dir}/mytruststore.jks"/>
       <ssl id="defaultSSLConfig" keyStoreRef="defaultKeyStore" trustStoreRef="appidtruststore"/>
    

缺省情况下,SSL 配置需要为 OpenID Connect 配置信任库。 了解有关 在 Liberty 中配置 OpenID Connect Client 的更多信息。

配置 Spring Boot for Java SDK

可以将 App ID 配置为使用 Spring Boot 应用程序。

准备工作

您必须满足以下先决条件:

  • App ID 服务的实例
  • 一组服务凭证
  • Java + Maven 项目
  • Apache Maven 3.5 或更高版本
  • Java 1.8
  • Spring Boot 2.0 和 Security OAuth 2.0 或更高版本

初始化 Spring Boot 框架

  1. 在 Maven pom.xml 文件中的 <project> </project> 标记之间添加以下代码。

    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.0.2.RELEASE</version>
       <relativePath/>
    </parent>
    
  2. 将以下依赖项添加到 Maven pom.xml 文件。

    <dependencies>
       <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
       </dependency>
       <dependency>
             <groupId>org.springframework.security.oauth.boot</groupId>
             <artifactId>spring-security-oauth2-autoconfigure</artifactId>
             <version>2.0.0.RELEASE</version>
       </dependency>
    </dependencies>
    
  3. 在同一文件中,包含 Maven 插件。

    <plugin>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    

初始化 OAuth2

  1. 将以下注释添加到 Java 文件中。

    @SpringBootApplication
    @EnableOAuth2Sso
    
  2. 使用 WebSecurityConfigurerAdapter 扩展该类。

  3. 覆盖任何安全配置并注册受保护端点。

       @Override
       protected void configure(HttpSecurity http) throws Exception {
          http.authorizeRequests()
                   .antMatchers("/protected_Resource").authenticated()
                   .and().logout().logoutSuccessUrl("/").permitAll();
       }
    

添加凭证

  1. 通过以下其中一种方式获取凭证。

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

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

      请求格式:

      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"}'
      

      示例响应:

      {
      "clientId": "111c22c3-38ea-4de8-b5d4-338744d83b0f",
      "tenantId": "39a37f57-a227-4bfe-a044-93b6e6060b61",
      "secret": "ZmE5ZDQ5ODctMmA1ZS00OGRiLWExZDMtZTA1MjkyZTc4MDB4",
      "name": "ApplicationName",
      "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/39a37f57-a227-4bfe-a044-93b6e6060b61"
      }
      
  2. application.yml 配置文件添加到 /springbootsample/src/main/resources/ 目录。 可以使用服务凭证中的信息来完成配置。

    security:
    oauth2:
       client:
       clientId: <clientID>
       clientSecret: <clientSecret>
       accessTokenUri: <oauthServerURL>/token
       userAuthorizationUri: <oauthServerURL>/authorization
       resource:
       userInfoUri: <oauthServerURL>/userinfo
    

使用 App ID 的其他语言版本

对于符合 OIDC 的客户端 SDK,可以使用 App ID 的其他语言版本。 请查看 认证图书馆列表,了解更多信息。

后续步骤

在应用程序中安装 App ID 后,您几乎已准备好开始对用户进行认证! 接着请尝试执行以下其中一个活动: