Web 应用程序
开发 Web 应用程序时,可以使用 IBM Cloud® App ID Web 流程来安全地认证用户。 然后,用户就可以在 Web 应用程序中访问服务器端受保护的内容。
了解流程
Web 应用程序通常要求用户进行认证以访问受保护的内容。App ID 使用 OIDC 授权代码流来安全地认证用户。 通过此流程,在认证用户时,应用程序会收到授权代码。 然后,会使用此代码来交换访问令牌、身份令牌和刷新令牌。 在代码中,令牌的交换步骤始终通过应用程序和 OIDC 服务器之间的安全后端通道发送。 由于攻击者无法截获令牌,因此这一过程提供了另一层安全保障。 可以将这些令牌直接发送到托管应用程序的 Web 服务器以进行用户认证。
-
用户通过 App ID SDK 或 API 向
/authorization
端点发送请求,以启动授权流程。 -
如果用户未获授权,那么启动的认证流程会重定向到 App ID。
-
根据用户的
/authorization
请求参数或身份提供者配置,将在用户的浏览器中启动登录窗口小部件。 -
用户选择身份提供者以进行认证并完成登录过程。
-
身份提供者使用授权代码重定向到客户端应用程序。
-
App ID SDK 使用授权代码来交换来自 App ID 服务的访问令牌、身份令牌和可选的刷新令牌。
-
令牌由 App ID SDK 保存,然后重定向到客户端应用程序。
-
授权用户访问应用程序。
配置 Node.js SDK
可以将 App ID 配置为使用 Node.js Web 应用程序。
准备工作
您必须满足以下先决条件:
- App ID 服务的实例
- 一组服务凭证
- NPM V4 或更高版本
- Node V6 或更高版本
- 在 App ID 服务仪表板中设置的重定向 URI
请查看以下视频,以了解有关使用 App ID 来保护 Node 应用程序的信息。 然后,使用 简单的 Node 示例应用程序亲自尝试一下。
安装 Node.js SDK
-
使用命令行切换到包含 Node.js 应用程序的目录。
-
安装 App ID 服务。
npm install --save ibmcloud-appid
初始化 Node.js SDK
-
将以下
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";
-
将 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。
-
通过以下其中一种方式获取凭证。
-
导航至 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" }
-
-
可选:决定如何设置重定向 URI 的格式。 重定向的格式可以通过两种不同方式进行设置。 如果未提供以下选项,App ID SDK 会尝试检索运行在 IBM Cloud 上的应用程序的
application_uri
,并附加默认后缀/ibm/cloud/appid/callback
。- 手动在新的
WebAppStrategy({redirectUri: "...."})
- 设置为名为
redirectUri
的环境变量
- 手动在新的
-
使用先前步骤中获取的信息来初始化 SDK。
passport.use(new WebAppStrategy({ tenantId: "<tenantID>", clientId: "<clientID>", secret: "<secret>", oauthServerUrl: "<oauthServerURL>", redirectUri: "<appURL>" + CALLBACK_URL }));
-
为 Passport 配置序列化和反序列化。 为了实现跨 HTTP 请求的认证会话持久性,此配置步骤是必需的。 更多信息,请参阅 护照文档。
passport.serializeUser(function(user, cb) { cb(null, user); }); passport.deserializeUser(function(obj, cb) { cb(null, obj); });
-
将以下代码添加到
server.js
文件以发出服务重定向。app.get(CALLBACK_URL, passport.authenticate(WebAppStrategy.STRATEGY_NAME));
-
通过将以下代码片段添加到
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
-
向
server.xml
添加 OpenID Connect 功能。<featureManager> <feature>ssl-1.0</feature> <feature>appSecurity-2.0</feature> <feature>openidConnectClient-1.0</feature> </featureManager>
-
通过以下两种方式之一来获取凭证。
-
导航至 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" }
-
-
创建 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
发行人标识符的格式如下: <region>>.cloud.ibm.com
。 了解有关 可用区域 的更多信息。tokenEndpointAuthMethod
被指定为“basic”。 signatureAlgorithm
被指定为“RS256”。 authFilterid
要保护的资源的列表。 trustAliasName
信任库中证书的名称。
初始化 Liberty for Java SDK
-
在
server.xml
文件中,定义授权过滤器以指定受保护资源。 如果未 定义过滤器,那么服务将保护所有资源。<authFilter id="myAuthFilter"> <requestUrl id="myRequestUrl" urlPattern="/protected_resource" matchType="contains"/> </authFilter>
-
将特殊主体类型定义为
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>
-
下载
libertySample-1.0.0.war
文件 GitHub 下载 文件,并将其放到服务器的应用程序文件夹中。 例如,如果服务器名为defaultServer
,那么该 WAR 文件将位于以下位置:target/liberty/wlp/usr/servers/defaultServer/apps/
。 -
通过将以下内容添加到
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 框架
-
在 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>
-
将以下依赖项添加到 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>
-
在同一文件中,包含 Maven 插件。
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>
初始化 OAuth2
-
将以下注释添加到 Java 文件中。
@SpringBootApplication @EnableOAuth2Sso
-
使用
WebSecurityConfigurerAdapter
扩展该类。 -
覆盖任何安全配置并注册受保护端点。
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/protected_Resource").authenticated() .and().logout().logoutSuccessUrl("/").permitAll(); }
添加凭证
-
通过以下其中一种方式获取凭证。
-
导航至 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" }
-
-
将
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 后,您几乎已准备好开始对用户进行认证! 接着请尝试执行以下其中一个活动:
- 配置身份提供者。
- 定制并配置登录窗口小部件
- 了解有关 Node.js SDK 的更多信息