Skip to main content
Azure API Management
2018/11/28
第14回 NS Study
上坂 貴志(@takashiuesaka)
俺的マニュアル
自己紹介
上坂貴志
• うえさかたかし
Twitter
• @takashiuesaka
• Facebookは開店休業状態
Microsoft MVP
• Microsoft Azure 2015年~
仕事
• マネージャー、プリセー
ルス、エバンジェリスト
最近の興味
• アジャイル、DDD、エン
ジニアトレーニング、k8s、
DevOps、.NET Core、
Frontendフレームワーク、
node.js
Nextscape Inc. 2
最近はこんなことしてました
3Nextscape Inc.
NEXTSCAPE
4
HoloLensアプリ作ろう DDDやろう Scrumでやろう!
SESやっていないので、自社で開発100%ですよ
只今、PM・エンジニア積極採用中です
Nextscape Inc.
Nextscape Inc. 5
今日の内容
API Managementとは
What is API Management?
• HTTPベースのAPIを外部に公開する時に必要な仕組みを一通り揃えたPaaSです。
• APIとそれを呼び出すClientとの間に挟み込むようにDeployします。
API Managementとは
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
API
Management
Nextscape Inc. 7
• 一般的にAPI公開時に求められる以下のようなシナリオに対応できます。
API Managementとは
外部の開発者に対してAPIごとに使用許可を制御したい
APIの使用を無料ユーザー用や有料ユーザーなどに分けて制御したい
APIのバージョンを簡単に管理したい
外部の開発者がAPIを呼び出してテストできるページを用意したい
• さらにAzure環境ならでは次の要求にも対応できます。
VNETで守られたVMで立てたAPIを外部に公開したい
VNET内部だけで公開するAPIに対して上記一般的なシナリオ(バージョン管理やテストページの用意など)に対応したい
Nextscape Inc. 8
API Management 全体像
Overview
Developers Guests
カスタム
Admins
API Management 全体像
API Management
グループ
API
サブスクリプション
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
開発者(ユーザー)
N:N
Operations
In
Out
Err
Policy
N:N
開発者ポータル
Nextscape Inc. 10
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
成果物(製品)
N:N
Developers Guests
カスタム
Admins
N:N
API Management 全体像
API Management
サブスクリプション
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
開発者(ユーザー)
N:N
API
(Backend)
(Publisher)
Operations
In
Out
Err
Policy
N:N
開発者ポータル
Client
(FrontEnd)
(Consumer)
Nextscape Inc. 11
API
成果物(製品)
グループ
API:
API Managementから到達できるAPIであればなんでも登録
できる。まずはここへ API を登録するところからスタート。
PolicyではRequest/Response/Errorに対して処理をC#で書
くことができる。
Developers Guests
カスタム
Admins
グループ
API Management 全体像
API Management
サブスクリプション
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
開発者(ユーザー)
N:N
Operations
In
Out
Err
Policy
N:N
開発者ポータル
Nextscape Inc. 12
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer) API
N:N
成果物(製品/Products):
docsでは「成果物」もしくは「製品」と記載されている。
Portalでは「製品」となっているので要注意。
APIに対してアクセス制御を行うのが主な役割。
APIと成果物はN:Nの関係性。APIは複数の成果物に登録がで
きる。
成果物(製品)
グループ
Developers Guests
カスタム
Admins
API Management 全体像
API Management
サブスクリプション
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
開発者(ユーザー)
N:N
Operations
In
Out
Err
Policy
N:N
開発者ポータル
Nextscape Inc. 13
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer) API
グループ:
開発者は複数の(カスタム)グループに所属することができる。
ユーザー登録した開発者は必ずDevelopersグループに所属する。
成果物のアクセス制御にグループを登録することで、そのグ
ループに所属する開発者はその成果物を使用することができる
ようになる。
グループと成果物はN:Nで紐づけることができる。
成果物(製品)
N:N
Developers Guests
カスタム
Admins
N:N
グループ
API Management 全体像
API Management
サブスクリプション
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
開発者(ユーザー)
N:N
Operations
In
Out
Err
Policy
N:N
開発者ポータル
Nextscape Inc. 14
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer)
Policyでできること(やること)の代表格
セキュリティ&アクセス制限
• API キー、JWT トークン、証明書、その他の資格情報を検証
• 使用量クォータとレート制限を適用
• IPアドレスやユーザーIDで接続を制限・スロットリング
キャッシュ
• Backend APIのResponseをキャッシュ
その他
• Request/Reponseログを転送
• 外部サービスをHttpで呼び出し
API
成果物(製品)Policy:
PolicyはBackend APIへRequestを投げる前後に処理を入れることができる。処理
はC#で実装する。
PolicyはBackend APIが公開する複数の操作(Operation)ごとに設定もできるし、
Backend API全てに共通の設定もできるなど、スコープが4段階ある。
(操作の例: /id)
実に多彩な処理の実装が可能。テンプレートもあるが、外部にReqeustを投げるこ
とができるので独自実装を頑張ればかなりのことができる。
Developers Guests
カスタム
Admins
N:N
グループ
API Management 全体像
API Management
サブスクリプション
Policy
Frontend Backend Api
/path https://~
https://<APIM Name>.azure-api.net
アクセス制御
開発者(ユーザー)
N:N
Operations
In
Out
Err
Policy
N:N
開発者ポータル
Nextscape Inc. 15
API
(Backend)
(Publisher)
Client
(FrontEnd)
(Consumer) API
アクセス制御:
アクセス制御は成果物を使用できるグループを設定す
ることで可能となる。
ここでいうアクセス制御とは、開発者(ユーザー)に
対してのものであることに注意。
Policyによるアクセス制限:
成果物にもPolicyが設定できる。API単位より上の
スコープでの設定と思えばOK。
例えば使用量上限があるプランのAPI群を公開し
たい場合、そのプラン用の成果物を作成して使用
量クォータによる制限のPolicy実装をここに設定
することになる。
成果物(製品)
サブスクリプション:
成果物では、開発者(ユーザー)に対して利用許諾の
申請を求める設定がある。その設定をONにした場合、
開発者&成果物ごとのサブスクリプションキーが発行
され、それをHeaderに入れないとRequestが失敗す
る。
(申請を自動承認するか、手動で承認するか選択)
超基本の使い方
Basic usage of API Management
APIを追加する
Nextscape Inc. 17
• Blank APIを選ぶと、自分でOperationを追加する必要がある
• 他のやつは定義を読んで自動的にメソッドを追加してくれる(はず)
• API作るときは、Swagger入れておくと便利だよってこと
APIを追加したあとの「API」画面
Nextscape Inc. 18
外部からRequestを
受ける入口の設定
バックエンドAPIの
設定
バックエンドAPIへRequest
を投げる前のカスタム処理
バックエンドAPIからのResponse
を返す前のカスタム処理
成果物へAPIを登録する
どれか選ぶ
もしくは事前に作っておく
APIを選ぶ
Nextscape Inc. 19
• 製品(成果物)メニューからAPIを登録する
APIの画面から成果物に登録できるようになれば素敵なんだけどなー
• APIを登録しただけだと動かない!
• missing subscription key というエラーが出たときの原因は大抵コレ
成果物へAPIを紐づける
Nextscape Inc. 20
GroupA
グループ
アクセス制御
開発者(ユーザー)成果物(製品)API
既存API
新規API
成果物に紐づけないと、
開発者からは見えない。
自分がAdminsグループに
所属する管理者の場合、
Portalからは見えるが実行
時はエラーになる。
成果物に紐づいていないので実
行するとエラーになる
• 外部ツール使ってもいいけど、APIManagementのテストツールを使ったほうが便利
• 自動的にサブスクリプションキーを入れてくれる
• Policy実装時には、このツールのTrace機能が必須(詳しくは「ポリシー」の最後にて)
• 設定すれば、外部IDProviderのOAuth2.0, OpenIdConnectのTokenを取得させることもできるので、認証が必須のAPIの設
定確認やPolicyの実装結果を確認する時に重宝する
試しにAPIMを叩く
Nextscape Inc. 21
大変残念なことにテストツール
の実行履歴が一切保存されない。
Policyの実装時にはちょっと辛い
認証結果の検証
• Policyにて実装
エラーハンドリング
• Policyにて実装
ログの出力
• Policyにて実装
スケーリング
• Portal/Powershell/Cliで設
定
バックアップ
• Portal/Powershellにて設
定
キャッシュ
• Portal/Powershellにて設
定
必要なら追加設定する
Nextscape Inc. 22
ポリシー
Policy of API Management
• ポリシーはXML形式。4ブロックに分かれている
ポリシーの基本形
<policies>
<inbound>
<!–- Backend APIを叩く前に呼びたい処理 -->
<base />
</inbound>
<backend>
<!–- Policyは1つだけしか実装できない。Backend APIを叩くための
Poilicyがデフォルトで実装されている -->
<base />
</backend>
<outbound>
<base />
<!–- Backend APIからのreponseを返す前に呼びたい処理 -->
</outbound>
<on-error>
<base />
</on-error>
</policies>
Nextscape Inc. 24
詳細は後述
詳細は後述
• C#の実装方法は2つの形式がある。
• どちらも括弧の前に@付ける
XMLの属性値にC#で実装していく
<set-variable name=“date1" value="@(context.Timestamp.ToString("R"))" />
<set-variable name=“date2" value="@{
var results = DateTime.Now.ToString(“yyyy/MM/dd HH:mm:ss.fffff”);
return results;
}" />
Nextscape Inc. 25
単文の場合は@()
複文の場合は@{}
• ポリシー式で使用できる .NET framework の型は決まっているため、usingは不要
• 保存時に名前空間を解決してくれているっぽい(解決できないとエラーになる)
• 言い換えると外部dll を読み込ませることができない(Nugetもできない)
っていうかこれラムダ式だわ インテリセンスが効かないんだよね・・・
• Reqeust/Response含めたあらゆる情報はこいつが持っている
暗黙的なオブジェクト context
Nextscape Inc. 26
Context
Timestamp: DateTime
Variables: IReadOnlyDictionary<string, object>
Response
Request
LastError
Headers: IReadOnlyDictionary<string, string[]>
IpAddress: string
Body
※一部抜粋
アクセス日時
<set-variables>でセットされた値を保持
Requestのヘッダー値
Request元のIPAddress
RequestのBody
• contextは、docsの
› 「ハウツーガイド」
› ポリシーの定義
› ポリシー式
› 「コンテキスト変数」セクション
• に情報がある
contextの中身を知らないと実装できない
Nextscape Inc. 27
• ちょっと見方にコツがいる。
• 例:Requestの情報がほしい
• まず、contextから探す。
• context.Requestというプロパティが
あるのはわかったが、Requestの型も
プロパティもわからない・・・
• Requestでこの画面内を検索する
contextの中身を知らないと実装できない
Nextscape Inc. 28
• context.Requestという項目が見つかった。
• このようにすべての情報はこの画面内にあるので検索して探していく
contextの中身を知らないと実装できない
• さらにここからUrlの型であるIUrlを検索してみると・・・
Nextscape Inc. 29
• IUrlの情報を得ることができる。
• context.Request.Url.Path と書くことで、リクエスト時のURLを取得できるこ
とがわかった
• プロパティ名は大文字小文字区別する(Case-Sensitive)
contextの中身を知らないと実装できない
Nextscape Inc. 30
• サブスクリプションごとに指定期間あたりの呼び出しレートを指定数に制限
利用を制限するポリシー
<inbound>
<rate-limit
calls="5“
renewal-period="60" />
<base />
</inbound>
Nextscape Inc. 31
<inbound>
<quota
calls="100“
bandwidth="40000“
renewal-period="604800" />
<base />
</inbound>
• サブスクリプションごとに呼び出し回数と帯域幅クォータの両方またはそのどちらかで制限
KBytes
Seconds
1分に5回まで
1週間に100回、
もしくは
40,000KBまで
• キーごとに指定期間あたりの呼び出しレートを指定数に制限
利用を制限するポリシー
<inbound>
<rate-limit-by-key
calls=“5”
renewal-period=“60“
counter-key=“@(context.Request.IpAddress)” />
<base />
</inbound>
Nextscape Inc. 32
<inbound>
<quota
calls=“100“
bandwidth=“40000“
renewal-period=“604800”
counter-key=“@(context.Request.IpAddress)” />
<base />
</inbound>
• サブスクリプションごとに呼び出し回数と帯域幅クォータの両方またはそのどちらかで制限
IPAddress毎に1
分に5回まで
IPAddress毎に
1週間に100回、
もしくは
40,000KBまで
counter-keyへのセットは文字列なんでもOK
• オブジェクトをディクショナリへ格納する
• 何かしらの処理の結果を格納する時に使う
set-variablesは多用する
Nextscape Inc. 33
<set-variable
name="putDate“
value="@(context.Timestamp.ToString("R"))" />
• ディクショナリはcontext.Variables : IReadOnlyDictionary<string, object>
• オブジェクトの取り出し方(GenericsではないのでCast必要)
• (cast)context.Variables[“keyName”]
putDateはディク
ショナリのKey名
• 同期リクエストの場合は<send-request>
• Responseを取得できる
• 非同期リクエストの場合は< send-request-one-way >
• Responseは取得できない
外部へリクエストを投げるポリシー
• <send-request>のResponseは、指定した変数名でcontext.Variablesディク
ショナリに格納される
<send-request mode="new" response-variable-name="testResponse" timeout="5" ignore-
error="true">
・・・
</send-request>
Nextscape Inc. 34
• Blob SDKが使えないのでREST Apiで実装
• ログを書く処理は非同期にしたいので、 send-request-one-way使用したい
• でもエラーでまくって辛かった。どうやってデバッグするか悩んだ
• 編み出したやり方は以下
• まずはsend-requestで実装。
• send-reqeustにはresponseを変数に入れる機能がある
• responseは、IReseponseクラス。
• responseの中身を見るために、set-variableの実行結果をTraceで見ることに(詳しくはこの後)
追加Blobにログを書くPolicy作ってみた
<set-variable name="test" value="@{
var hoge = ((IResponse)context.Variables["testResponse"]).Body.As<string>();
return hoge;
}" />
<send-request mode="new" response-variable-name="testResponse" timeout="5" ignore-
error="true">
・・・
</send-request>
Nextscape Inc. 35
responseを格納する変数
変数値をTraceで表示させるために意味なく
他の変数にセットする
• これを埋めていく
追加Blobにログを書くPolicy作ってみた
<inbound>
<base />
<set-variable name="version" value="@("2015-04-05")" />
<set-variable name="putDate" value="@(context.Timestamp.ToString("R"))" />
<set-variable name="logData" value="@{
// ログに出力する内容を作る
return something;
}" />
<set-variable name="authorizationHeader" value="@{
// BlobのBearer Authorizationヘッダーを作る
return authorizationHeader;
}" />
<send-one-way-request mode="new">
// 非同期のリクエストを投げる
</send-one-way-request>
</inbound>
Nextscape Inc. 36
• 非同期のリクエストを投げる実装(他は省略)
追加Blobにログを書くPolicy作ってみた
<send-one-way-request mode="new">
<set-url>https://{{logstorageName}}.blob.core.windows.net/test/append-
blob.log?comp=appendblock</set-url>
<set-method>PUT</set-method>
<set-header name="x-ms-version" exists-action="override">
<value>@((string)context.Variables["version"])</value>
</set-header>
<set-header name="x-ms-date" exists-action="override">
<value>@((string)context.Variables["putDate"])</value>
</set-header>
<set-header name="Authorization" exists-action="override">
<value>@((string)context.Variables["authorizationHeader"])</value>
</set-header>
<set-body>@((string)context.Variables["logData"])</set-body>
</send-one-way-request>
Nextscape Inc. 37
• テストツールのTraceを見れば、リクエスト先が返したエラー情報が見え
る。
• Ocp-Apim-Traceヘッダにtrueという値を入れておく必要があるが、デフォルトで設
定済みなのであまり気にしなくて大丈夫
Policyのデバッグ方法
Nextscape Inc. 38
デフォルトはMessageタブが
表示されているので、Trace
に切り替える
この例では、<set-varialble>に設定されたポ
リシー式を評価した(実行した)結果を表
示している。
Globalレベル(API の All APIsに設定する)
成果物レベル(製品)
API レベル(API の All Operationsに設定する)
各Operationsレベル
ポリシーには階層がある
• 上から順に評価される。
Nextscape Inc. 39
Globalレベル
成果物レベル
APIレベル
各Operationsレベル
ポリシーには階層がある
• 上位のPolicyは<base />と記載してある箇所に適用される
• <base />を消せば、上位のPolicyは無視したことになる
Nextscape Inc. 40
<policies>
<inbound>
<base />
<authentication-certificate thumbprint="3B262F5910138…" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
• この実装が API レベルにされている場合、<inbound>の<base />はGlobalと成
果物レベルの<inbound>の処理を意味している
• <backend>だけはデフォルトでグローバルレベルに<forward-request>が実装
されている。こいつがBackend Apiを呼び出すタグ。
<backend>について
Nextscape Inc. 41
成果物、API、Operationsの全てのレ
ベルのデフォルト実装の<backend>の
<base />は、削除するとBackend APIが
呼び出されなくなるので注意してね
Operationsレベルの例
グローバルレベルの例
• <backend>には1つだけしかPolicyを実装できない制約がある!
<backend>について
Nextscape Inc. 42
<backend>
<retry condition="@(context.Response.StatusCode == 500)" count="3" interval="1">
<forward-request />
</retry>
</backend>
<backend>
<base />
<retry condition="@(context.Response.StatusCode == 500)" count="3" interval="1">
</retry>
</backend>
エラーとなってしまう例
入れ子にして回避
上位スコープに
<forward-request />
が設定されているため必要
<base />を削除
• Visual Studio Code用のスニペットならある・・・けど使えないかな
• https://github.com/Azure/api-management-policy-snippets
ポリシーの素敵なエディタはないのか
Nextscape Inc. 43
開発者とグループ
Developers and Group
開発者とグループ
• グループは成果物とN:Nで紐づけることで開発者へのAPI公開を制御する
グループ
アクセス制御
成果物(製品)
アクセス制御
GroupA
GroupB
API
API
API
API
API
開発者
全部のAPI使用可
下2つのAPIのみ
使用可
Nextscape Inc. 45
開発者とグループ
• デフォルトで用意されているグループは3つ
• Administrators, Develpers, Guests
• 開発者を新規追加すると、デフォルトでDevelopersグループ所属になる
Nextscape Inc. 46
開発者(ユーザー)
Developers
Guests
Admins
デフォルトグループ
GroupA
GroupB
カスタムグループ
開発者をPortalから追加しても、開発者
ポータルから開発者自身がサインアップ
しても、必ずDevelpersグループの所属に
なる
Addボタンがない!
開発者とグループ
• あれ、Admin, Guestへのユーザー追加はどうやるのか?
• Powershellなら追加できるっていう訳じゃなかった
Nextscape Inc. 47
• 共同作成者以上の権限を持つAzureユーザーは自動的に全員Adminグループに紐づけられる
• Adminsグループは新規作成の成果物のアクセス制御に自動的に登録される
開発者とグループ
グループ
アクセス制御
開発者(ユーザー)成果物(製品)API
API
アクセス制御
Developers
Guests
Admins
デフォルトグループ
Azure ユーザー
APIM作成者
APIM共同作成者
GroupA
GroupB
カスタムグループ
自動的に紐づけられる
Azureユーザーが紐づける
Nextscape Inc. 48
• Guestsグループはユーザー登録をしていない匿名ユーザーが
暗黙的に所属するグループ
(登録前にお試しに使ってもらいたい場合などはGuestsグ
ループに紐づける=登録しない)
API
API
API
API Manegement Role別機能差
APIM作成者 or APIM 共同作成者 APIM Operator Role APIM Reader Role
Portal フル権限 参照のみ。変更設定できるのは
スケールアップ・ダウン、SSL、
カスタムドメインの設定ぐらい
メトリックス参照で
きるぐらい。その他
は参照すらできない
開発者ポータル フル権限 × ×
所属Group Administrator Guest Guest
• APIMの作成者、またはAPIM 共同作成者ロール
の権限があるAzureユーザーは、暗黙的に
Administratorグループに所属する(共同作成者
は画面にユーザーとしては表示されない)
• APIM Service Reader Role, Operator Roleの権限を
もつAzureユーザー、もしくはユーザー登録を
していない(認証していない)場合は暗黙的
にGuestグループに所属する
Nextscape Inc. 49
• カスタムグループへの開発者の登録はPortalで管理者が行う以外の手段がない
• こんな設定にしてあったら、自動的に登録してくれないのかな?
カスタムグループへの開発者の登録は手動だけ
カスタムサブスクリプション
アクセス制御Policy
開発者ポータル
成果物(製品) グループ
Developers
1.サブスク申請が
承認されたら
2.カスタムグループに自
動的に登録されないのか1 2
Nextscape Inc. 50
• 承認が必要な成果物を作る
• 成果物に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
試すならこんな手順
試してみた
Nextscape Inc. 51
• 承認が必要な成果物を作る
• 成果物に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
試してみた
Nextscape Inc. 52
• 承認が必要な成果物を作る
• 成果物に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
Developerグループも紐づけておかないと、開発
者ポータルに成果物が表示されない
試してみた
Nextscape Inc. 53
• 承認が必要な成果物を作る
• 成果物に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
• 開発者ポータルで申請中になったことを確認
試してみた
Nextscape Inc. 54
試してみた
Nextscape Inc. 55
• 承認が必要な成果物を作る
• 成果物に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
• 申請が許可されてSucscription Keyが発行された
試してみた
Nextscape Inc. 56
試してみた
Nextscape Inc. 57
• 承認が必要な成果物を作る
• 成果物に対してカスタムグループを紐づけておく
• 開発者ポータルからこの成果物に対して
サブスクリプション申請
• Portalからサブスクリプションを承認
• 紐づいたカスタムグループにユーザが登録されるか
追加されなかった・・・残念
サブスクリプション
Subscription
• 開発者への成果物に対する利用許諾のこと。
• 登録したユーザーだけが使用できるようにしたい場合の設定。
• Front APIへのRequestにsubscription keyのセットを必須にする
• 開発者は利用許諾の申請を開発者ポータルより行う。(Azureポータルじゃない)
サブスクリプション
Nextscape Inc. 59
• 申請を自動承認にした場合は、申請
されたら即時 subscription key が発行
される。
• 要承認にした場合は、Portalから管
理者が手動で承認する必要がある。
• 利用許諾の申請が発生してもメール
が飛ぶ、Webhookを叩くなどのメン
ションを飛ばすことができない(不
便すぎて困る)
• Portalに
• 「サブスクリプションの追加」
• 「サブスクライバーの追加」
• の2つの表記があり、用途の違いがわからなくて混乱しちゃうので整理しておく。
サブスクリプション
「サブスクリプションの追加」とは、成果物(製品)と開発者(ユーザー)の両方を指定して承認すること
Nextscape Inc. 60
• 成果物(製品)からサブスクリプションを選んだ時には、「サブスクライバーの追加」というメニュー
がある。
サブスクリプション
「サブスクライバーの追加」とは、開発者(ユーザー)だけを指定して承認すること
Nextscape Inc. 61
• ユーザーが開発者ポータルからサブスクライブする
要承認にした時のサブクライブの挙動
Nextscape Inc. 62
• Subscription name(利用許諾名)は自分で入力する(謎仕様)
要承認にした時のサブクライブの挙動
Nextscape Inc. 63
• リクエストしたので承認待ち状態になる
要承認にした時のサブクライブの挙動
Nextscape Inc. 64
• Azure Portalで見ると、承認待ち状態になっている。
• なぜか「状態」は「送信済み」という表記。(「承認待ち」にしてほしい・・・)
• 「サブスクリプションのアクティブ化」をクリックする。
要承認にした時のサブクライブの挙動
Nextscape Inc. 65
• 開発者ポータルを読み込みなおすと、Subscription Keyが発行されている
要承認にした時のサブクライブの挙動
Nextscape Inc. 66
開発者ポータル
Developers Portal
※docsでは「開発者」を「ユーザー」と表記しているページも多いので注意
https://<APIMName>.portal. azure-api.net
開発者ポータルのURLは
管理者権限があるならここ
から遷移すればいい
Nextscape Inc. 68
開発者ポータルの見た目(デザイン可能)
Nextscape Inc. 69
• 開発者が
• 自らユーザーとして登録する機能
• 開発者が使いたい成果物(APIを含んでいる)に対して利用許諾を申請する機能
• APIをお手軽に試すテスト機能
• 不具合を報告する機能(管理者にはmailが飛んでくる)
• などを持つ、開発者のための画面。
• APIMagementインスタンスとは全く別のリソースと思ったほうが良い
• 開発者ポータルはAPIMagementとは無関係のWebクライアントとして認識したほう
がdocsが読みやすい
• AzurePortalでは、(基本的に)開発者ポータルへのログインユーザーの権
限管理しかしない
• 権限管理以外だと、開発者ポータルがAPIMgmtに対してRequestする前に外部
IDProviderからid_token(JWT)を得る、もしくは認証サーバーからaccess_tokenを得
るための機能のための設定をするぐらい(ややこしいので後述する)
そもそも開発者ポータルとは何か
Nextscape Inc. 70
1.Portalから手動で追加する
2.Portalからメールアドレスを入力して招待する
3.開発者ポータルから自分でサインアップ(要セットアップ)
開発者を追加する方法は?
3つの方法がある
Nextscape Inc. 71
• Portalからのユーザー追加は ID/PW認証のみ
1.Portalから手動で追加する
Nextscape Inc. 72
2.Portalからメールアドレスを入力して招待する
Nextscape Inc. 73
2.Portalからメールアドレスを入力して招待する
Nextscape Inc. 74
3.開発者ポータルから自分でサインアップ
Nextscape Inc. 75
3.開発者ポータルから自分でサインアップ
Nextscape Inc. 76
3.開発者ポータルから自分でサインアップ
Nextscape Inc. 77
3.開発者ポータルから自分でサインアップ
Nextscape Inc. 78
• Portalにログインできて、かつユーザーを管理する権限を付与されているユーザーにしかできない
Portalから手動で追加する
• 開発者ポータルのID/PWを使ったサインアップ画面へのリンクがメールで飛ぶ
• Portalにログインできて、かつユーザーを管理する権限を付与されているユーザーにしかできない
• ID/PWサインアップのセットアップが必須(デフォルトでID/PW認証はセットアップされている)
Portalからメールアドレスを入力して招待する
• 運用者は開発者ポータルのURLを送るだけ良いので一番楽
• ID/PWを使ってサインアップ、もしくは
• 外部IDProvider(AzureAD, Facebook, Twitterなど)を使って認証させることができる
開発者ポータルから開発者が自分でサインアップ
開発者を追加する方法は?
まとめ
Nextscape Inc. 79
セキュリティ->ユーザーで認証方式を登録する
Nextscape Inc. 80
開発者ポータルサインアップのセットアップ方法は?
Nextscape Inc. 81
するとサインアップ画面が現れる
開発者ポータルサインアップのセットアップ方法は?
これが
こうなる
でも、これID/PWの場合だけ!
サインアップだとこうなっちゃう サインインなら外部のIDProviderが表示される
外部のIDProvider(FacebookとかTwiterとか)を有効にしたときはサインインを使
わないといけないので注意!
開発者ポータルサインアップのセットアップ方法は?
Nextscape Inc. 82
開発者ポータルの
カスタマイズが必須
(別に難しくはない)
• 認証の種類にFacebookって出る
Facebookで認証してサインアップすると
だから何ってわけじゃないけど・・・。
Nextscape Inc. 83
Nextscape Inc. 84
開発者ポータルって日本語化できないの?
完璧じゃないけど一応できる。もうすぐ
無くなってしまう発行者ポータルより設
定可能
(Portalで設定できるようになるはず)
セキュリティ
Security
API Managementでいうセキュリティは複数個所ある
セキュリティ
コンシューマ
パブリッシャー
API Management
開発者ポータル
1 2
API
Client
3
4
Nextscape Inc. 86
Nextscape Inc. 87
用途が混在していてわかりにくいので要注意
Portalのセキュリティセクション
開発者ポータルの認証方式の設定
• クライアント認証の検証時に使う証明書をUploadする
• APIを呼び出す時に使う証明書をUploadする
(どちらもUploadだけじゃダメで、Policyにて実装が必要)
独自に実装した開発者認証、成果物のサブスクリプションを
行う認証サーバーの設定
• 開発者ポータルの認証方式の設定
• 開発者ポータルからAPIをテストする時にTokenを取得する
ために必要な認可サーバー(or IDProvider)の設定
1 2
3
3
4
APIClient
3
「開発者ポータル」で
説明済み
3
2
4は証明書の検証もできるが、PolicyでJWTの検証をするのがメイン1
1
説明済み
• これをセットアップすると、開発者ポータルでTokanを取得できるようになる、というだけ!
• 勘違いしがちなのは、これをセットアップするとなんかよくわかんないけど外部の認証サー
バー(IDProvider)を使って認証してくれるようになるんだ、なんて思わないこと!
• なので、 APIのエンドポイントがむき出しの場合にAPI側で認証結果(JWTとか)を検証する実装
をさぼれる訳じゃない、ということ
• API側がFunctionsみたいにアクセスキーがある場合はアクセスキーの検証だけでOKとして、認証結果の検
証を実装しなくてもいいのかは判断が必要
• APIがVNET内部にDeployしてあって外部からの攻撃はない、という場合なら気にしなくていいかも
OAuth2.0, OpenIdConnectの使い方
• 開発者ポータルの認証方式の設定
• 開発者ポータルからAPIをテストする時にTokenを取得する
ために必要な認可サーバー(or IDProvider)の設定4
3
Nextscape Inc. 88
1 2
3
APIClient 4
説明済み
開発者ポータルでOAuth2.0のTokenを取得する
Nextscape Inc. 89
AzureADという名前を
付けた
• APIにOAuth2.0を使用するようにセットアップ(これが誤解させる元凶)
開発者ポータルでOAuth2.0のTokenを取得する
Nextscape Inc. 90
Try it をクリックして
開発者ポータルでOAuth2.0のTokenを取得する
Nextscape Inc. 91
承認コードを選択する
• ログインダイアログがポップアップ(ログインしていなかった場合)
• アクセス許可の承認を求められる
開発者ポータルでOAuth2.0のTokenを取得する
Nextscape Inc. 92
• アクセストークンを取得して保持したこと
がわかる
PortalのTest機能は、サブ
スクリプションキーを自
動的にHeaderにセットす
る機能しかない
OAuth2.0, OpenIdConnectの使い方
• PortalのTest機能にはアクセストークンを取得する機能はないので間違えな
いように!(開発者ポータルでやること!)
Nextscape Inc. 93
• API Managementは認証・認可(承認)の機能は持っていない。あくまでJWTの検証をするPolicy
がデフォルトで用意されているだけ
• JWTを検証する、ということはIDProviderはAzureAD、B2Cだけしか使えないわけじゃない。
OpenIdConnectをサポートするIDProviderであればなんでも大丈夫
validate-jwt 1 2
3
APIClient 4
は証明書の検証もできるが、PolicyでJWTの検証をするのがメイン1
Client
API Mgmt
B2C
IDProvider
JWT
JWT
• OAuth2.0ではなくOpenId Connectであることに注意。
OAuth2.0の返すaccess_tokenは仕様が策定されてないし、
通常JWTは使用されない。(ランダム文字列)
• OpenId Connectであれば、id_tokenがJWTで返却される。
• id_tokenの中にClameが格納されている。
Nextscape Inc. 94
• 最終的に次の構成を組む
validate-jwtを試す(敢えてAzureAD以外で)
Client API Mgmt
JWT
API
JWT
Validate
OpenId Connect
• その前にまずはローカル環境JWTを取得する実装をして、JWTのValidationもやってみる
Client
JWTJWT
Validate
JWT
OpenId Connect JWT
Client
Nextscape Inc. 95
• https://console.developers.google.com
• プロジェクトを作る
• 既にあるならそれでもいい
Google Developers Console
Nextscape Inc. 96
Google+ APIを追加する
Nextscape Inc. 97
• 認証にはこのAPIの追加が必要、というBlogもあれば、不要、というBlogもある
• 今回はそこがポイントじゃないので取り合ず追加しとく
• (多分追加は不要だと思われる。オワコンだし)
Google+ APIを追加する
Nextscape Inc. 98
認証情報を作る
Nextscape Inc. 99
認証情報を作る
Nextscape Inc. 100