バックエンド・アプリ
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 でのトークンの使用方法について詳しくは、トークンについてを参照してください。
フローの概要
-
クライアントは 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> -
クライアントが資格を満たしている場合、許可サーバーはアクセス・トークンを返します。
-
クライアントが保護リソースに要求を送信します。 使用する HTTP クライアント・ライブラリーに応じて複数の方法で要求を送信できますが、要求には一般に次の形式を使用します。
curl -H 'Authorization: Bearer <accessToken>' <https://my-protected-resource.com> -
保護リソースまたは保護 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 のインストール
-
App ID Node.js SDK をアプリの
package.jsonファイルに追加します。"dependencies": { "ibmcloud-appid": "^7.0.0" } -
次のコマンドを実行します。
npm install
Node.js SDK の初期化
-
oauth server urlを取得します。- App ID ダッシュボードの**「サービス資格情報」**タブに移動します。
- 資格情報のセットがまだない場合は、**「新規資格情報」をクリックし、「追加」**をクリックして新規セットを作成します。 ある場合は、このステップをスキップしてください。
- **「資格情報の表示」**トグルをクリックして情報を表示します。
- 次のステップで使用する
oauth server urlをコピーします。
-
以下の例に示すように、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 がアプリケーションにインストールされたので、ユーザーの認証を開始する準備がほとんどできています。 次に、以下のいずれかの作業を行ってください。
- ID プロバイダーを構成します
- ログイン・ウィジェットのカスタマイズと構成を行います
- 詳しくは、 Node.js SDK を参照してください。
- Swift SDKの詳細