バックエンド・アプリ
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の詳細