IBM Cloud Docs
バックエンド・アプリ

バックエンド・アプリ

IBM Cloud® App ID SDK および API を使用して、バックエンド・アプリケーション・エンドポイントおよび API を保護できます。

フローについて

バックエンド・アプリの開発には、API を無許可アクセスから確実に保護することが含まれます。 App ID SDK は、API エンドポイントを保護し、アプリケーションのセキュリティーを確保するのに役立ちます。

このフローの技術基盤

App ID は、認証と認可にベアラートークンを使用する OAuth 2.0 と OIDC 仕様を実装しています。 これらのトークンは JSON Web トークンとして書式化され、電子署名され、認証される対象および ID プロバイダを記述するクレームを含む。 アプリケーションの API は、アクセス・トークンと識別トークンによって保護されます。 API にアクセスする必要があるクライアントは、それらのトークンを交換することによって、App ID を介して ID プロバイダーで認証されます。 保護 API へのアクセス権限を付与するには、トークン内のクレームを検証する必要があります。

App ID でのトークンの使用方法について詳しくは、トークンについてを参照してください。

フローの概要

caption-side=bottom"
App ID バックエンド・フロー バックエンド・アプリケーション・フロー

  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.js SDK の使用を開始する前に、以下の前提条件を満たしておく必要があります。

  • App ID のインスタンス
  • NPM バージョン 4 以上
  • Node バージョン 6 以上

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 Strategy を使用した API の保護

以下のスニペットは、ApiStrategy GET API を保護するために Express アプリで /protected を使用する方法を示しています。

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 サーバー・サイド Swift SDK には、バックエンド・アプリの保護に使用する 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 がアプリケーションにインストールされたので、ユーザーの認証を開始する準備がほとんどできています。 次に、以下のいずれかの作業を行ってください。