IBM Cloud Docs
后端应用程序

后端应用程序

您可以使用 IBM Cloud® App ID SDK 和 API 来保护后端应用程序端点和 API。

了解流程

在开发后端应用程序的过程中,有一部分工作是验证 API 是否受到保护,免受未经授权的访问。 App ID SDK 可帮助您保护 API 端点并确保应用程序的安全性。

流程的技术基础是什么?

App ID实现了 OAuth2.0和 OIDC 规范,该规范使用承载令牌进行身份验证和授权。 这些令牌格式为 JSON 网络令牌,经过数字签名,包含描述认证主体和身份提供者的声明。 应用程序的 API 受访问令牌和身份令牌保护。 需要访问 API 的客户端可以通过 App ID 向身份提供者进行认证,以交换这些令牌。 必须验证令牌中的声明,才能允许访问受保护的应用程序接口。

有关如何在 App ID 中使用令牌的更多信息,请参阅了解令牌

此流程是什么样子的?

App ID backend flow
Backend application flow

  1. 客户端向 App ID 授权服务器发出 POST 请求,以获取访问令牌。 POST 请求通常采用以下格式:

    POST /oauth/v4/<tenantID>/token HTTP/1.1
    Content_type: application/x-www-form-urlencoded
    Authorization header = "Basic" + base64encode(<clientID>:<secret>)
    FormData = <grantType>
    
  2. 如果客户端符合资格要求,那么授权服务器会返回访问令牌。

  3. 客户端向受保护资源发送请求。 请求可以通过多种方式发送,具体取决于您使用的 HTTP 客户端库,但请求通常会采用以下格式:

    curl -H 'Authorization: Bearer <accessToken>'
    <https://my-protected-resource.com>
    
  4. 受保护资源或 API 验证令牌。 如果令牌有效,将为客户端授予对资源的访问权。 如果无法验证此令牌,那么将拒绝授予访问权。

有关如何配置应用程序以使用 Liberty for Java的信息,请参阅 快速启动: Liberty for Java 后端应用程序教程

使用 Node.js SDK 保护资源

您可以使用 App ID SDK 对服务器端应用程序强制实施认证和授权。 ApiStrategy 通过要求作为请求的一部分对访问令牌和身份令牌进行验证,从而保护后端资源。 App ID Node.js SDK 使用 Passport 框架

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

准备工作

在开始使用Node.jsSDK 之前,您必须具备以下先决条件。

  • App ID 的实例。
  • NPM V4 或更高版本
  • Node V6 或更高版本

安装 Node.js SDK

  1. 将 App ID Node.js SDK 添加到应用程序的 package.json 文件。

    "dependencies": {
       "ibmcloud-appid": "^7.0.0"
    }
    
  2. 运行以下命令。

    npm install
    

初始化 Node.js SDK

  1. 获取 oauth server url

    1. 导航至 App ID 仪表板的服务凭证选项卡。
    2. 如果您还没有凭证集,请单击新建凭证,然后单击添加以创建新集。 如果已有凭证集,请跳过此步骤。
    3. 单击查看凭证切换开关以查看您的信息。
    4. 复制 oauth server url 以在下一步中使用。
  2. 初始化 App ID passport 策略,如以下示例所示。

    var express = require('express'); 
    var passport = require('passport');
    var APIStrategy = require('ibmcloud-appid').APIStrategy; 
    passport.use(new APIStrategy({ oauthServerUrl: "<oauthServerUrl>" })); 
    var app = express();
    app.use(passport.initialize());
    

使用 API 策略保护 API

以下片段演示了如何在 Express 应用程序中使用 ApiStrategy 来保护 /protected GET API。

如果 Node.js 应用程序在 IBM Cloud 上运行并与 App ID 的实例绑定,那么无需提供 API 策略配置。 App ID 配置会使用 VCAP_SERVICES 环境变量来获取信息。

 app.get('/protected_resource', passport.authenticate('APIStrategy.STRATEGY_NAME', { session: false }), function(request, response){
   console.log("Security context", request.appIdAuthorizationContext);
   response.send(200, "Success!");
   }
);

令牌有效时,将调用请求链中的下一个中间件,并将 appIdAuthorizationContext 属性添加到请求对象。 此属性包含原始访问令牌和身份令牌,以及相应令牌的已解码有效内容信息。

使用 Swift SDK 保护资源

App ID服务器端SwiftSDK 提供了一个 API 保护中间件插件,用于保护您的后端应用程序。 通过将 API 与中间件相关联,可以保护应用程序免受未经授权的访问。 在 API 受到保护后,中间件将确保对 App ID 生成的令牌进行验证。 然后,您可以根据验证结果修改 API 的行为。

import Foundation
import Kitura              // server
import Credentials         // middleware
import IBMCloudAppID       // SDK

// setup routes
let router = Router()

// mandatory option to be passed in if app not deployed on IBM Cloud
let options = [
    "oauthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/d8438de6-c325-4956-ad34-abd49194affd",
]
let apiCreds = Credentials()

// Minimum macOS version required
if #available(OSX 10.12, *) {

    // setup API protection
    let apiKituraCredentialsPlugin = APIKituraCredentialsPlugin(options: options)
    apiCreds.register(plugin: apiKituraCredentialsPlugin)

    // associate route with API protection
    router.all(middleware: apiCreds)

    // create protected API
    router.get("/protectedendpoint") { request, response, next in

        response.headers["Content-Type"] = "text/html; charset=utf-8"
        do {
            if let userProfile = request.userProfile  {
                try response.status(.OK).send(
                    "<!DOCTYPE html><html><body>" +
                        "Welcome " + userProfile.displayName  +
                        "! You are logged in with " + userProfile.provider + "." +
                    "</body></html>\n\n").end()
                next()
                return
            }
            try response.status(.unauthorized).send(
                "<!DOCTYPE html><html><body>” + “You are not authorized!" +
                "</body></html>\n\n").end()
        }
        catch {}
        next()
    }

    // Start server
    Kitura.addHTTPServer(onPort: 8090, with: router)

    Kitura.run()  
}

手动保护资源

要保护后端应用程序和受保护资源,您需要验证令牌。 当客户端向您的资源发送请求时,您可以验证令牌是否符合定义的规范。 令牌可能包含标识信息、作用域或您已实施的其他任何配置。 可以通过多种方式来验证 App ID 的访问令牌和身份令牌。 要获取帮助,请查看验证令牌

后续步骤

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