2015-08-31

AzureADのGraph API触ってみた

Azure Active DirectoryGraphAPIを触る機会があったので、備忘として残しておきます。

Graph APIの利用にあたって、以下のサイトを参考にしました。

Azure Active Directoryアプリケーションの作成

Azureのポータルにログインして、任意のAzure Active Directoryを選択します。

azureapp-graph-select-directory

アプリケーションタブを選択して、[追加]をクリックします。

azureapp-graph-new

[組織で開発中のアプリケーションを追加]を選択します。

azureapp-graph-select

アプリケーションの名前をテキトーに記述し、種類は[WEBアプリケーションやWEB API]を選択します。

azureapp-graph-info

アプリケーションのプロパティもテキトーでOKです。

azureapp-graph-properties

作成したら、クライアントIDをコピってキーを生成します。キーは保存時に表示されるので、保存直後にメモってください。

azureapp-graph-keys

アプリケーションの権限は以下のように設定します。

azureapp-graph-access

azureapp-graph-applicationaccess

azureapp-graph-delegateaccess

あとは保存すればOK。キーは保存直後にしか表示されないので、必ずコピーするのを忘れないようにしてください。

下部のメニューに[エンドポイントの表示]のリンクがあるのでクリックすると、APIコールに必要な各エンドポイントが表示されます。今回は、GRAPH APIエンドポイント、OAUTH2.0トークンエンドポイントを利用します。

azureapp-graph-endpoint

OAuth2.0で認証・認可リクエスト

REST APIのためのaccess_tokenはOAuth2.0のAuthorization Code Grantか、Client Credentials Grantで取得します。 Client Credentialsのリクエストサンプルを以下に示します。

$ curl -i -X POST \
   -H "Content-Type:application/x-www-form-urlencoded" \
   -d \
'grant_type=client_credentials&client_id={client_id}&client_secret={client secret}&resource=https://graph.windows.net' \
 '{oauth2.0 token endpoint}?api-version=1.0'

resourceを指定しないと以下のように怒られるので注意して下さい。

{
    "error": "invalid_resource",
    "error_description": "AADSTS50001: Resource identifier is not provided.\r\nTrace ID: 2681d81c-f8e6-4dc1-ae5d-5a13e351d660\r\nCorrelation ID: b6c2dd34-82c1-476c-ac75-2c0743fb0ed3\r\nTimestamp: 2015-08-18 06:36:19Z",
    "error_codes": [
        50001
    ],
    "timestamp": "2015-08-18 06:36:19Z",
    "trace_id": "2681d81c-f8e6-4dc1-ae5d-5a13e351d660",
    "correlation_id": "b6c2dd34-82c1-476c-ac75-2c0743fb0ed3",
    "submit_url": null,
    "context": null
}

正常なレスポンスはこんな感じ

{
    "expires_in": "3600",
    "token_type": "Bearer",
    "scope": "Directory.Read Directory.Write user_impersonation UserProfile.Read",
    "expires_on": "1439879245",
    "not_before": "1439875345",
    "resource": "https://graph.windows.net",
    "access_token": "eyJ0eXAiOiJKV1QiLCJhb***************"
}

access_tokenがeyJ…で始まることからわかるように、JWTになっています。 ちなみにJWTのヘッダ、ボディはこんな感じ

{
    "typ": "JWT",
    "alg": "RS256",
    "x5t": "MnC_VZcATfM5pOYiJHMba9goEKY",
    "kid": "MnC_VZcATfM5pOYiJHMba9goEKY"
}

{
    "aud": "https://graph.windows.net",
    "iss": "https://sts.windows.net/**************/",
    "iat": 1439878262,
    "nbf": 1439878262,
    "exp": 1439882162,
    "ver": "1.0",
    "tid": "***************",
    "oid": "3d435e80-22c0-4bb1-a45b-9ae56073b3d2",
    "sub": "3d435e80-22c0-4bb1-a45b-9ae56073b3d2",
    "idp": "https://sts.windows.net/**************/",
  "appid": "**************",
  "appidacr": "1"
}

ユーザ情報の取得

リクエスト

$ curl -i -X GET \
   -H "Authorization:Bearer {access_token}" \
 '{GraphAPI endpoint}/users?api-version=2013-04-05'

レスポンス

{
    "odata.metadata": "https://graph.windows.net/*********/$metadata#directoryObjects/Microsoft.WindowsAzure.ActiveDirectory.User",
    "value": [
        {
            "odata.type": "Microsoft.WindowsAzure.ActiveDirectory.User",
            "objectType": "User",
            "objectId": "043765fe-6846-41af-9563-83be11546e8e",
            "accountEnabled": true,
            "assignedLicenses": [],
            "assignedPlans": [],
            "city": null,
            "country": null,
            "department": null,
            "dirSyncEnabled": null,
            "displayName": "太郎 HOGE",
            "facsimileTelephoneNumber": null,
            "givenName": "太郎",
            "jobTitle": null,
            "lastDirSyncTime": null,
            "mail": null,
            "mailNickname": "hoge_hotmail.co.jp#EXT#",
            "mobile": null,
            "otherMails": [
                "hoge@hotmail.co.jp"
            ],
            "passwordPolicies": null,
            "passwordProfile": null,
            "physicalDeliveryOfficeName": null,
            "postalCode": null,
            "preferredLanguage": null,
            "provisionedPlans": [],
            "provisioningErrors": [],
            "proxyAddresses": [],
            "state": null,
            "streetAddress": null,
            "surname": "HOGE",
            "telephoneNumber": null,
            "usageLocation": "JP",
            "userPrincipalName": "hoge_hotmail.co.jp#EXT#@*****.onmicrosoft.com"
        },...
    ]
}

odata.metadataの記述からわかるとおり、Graph APIはODataに対応しています。

GraphExplorerを使ったGraph APIの検証

GraphExplorerを使って、GraphAPIの検証を行うことができます。 参考URLはこちら→Getting started with the Graph API with the Graph Explorer

https://graphexplorer.cloudapp.netにアクセスして、右上の[Sign In]をクリックします。

graphexplorer-home

OAuth2.0のAuthorization Code Grantフローが走るので、認証・認可を行います。

認可処理後はURL欄にテナント名がセットされるので、この状態でGraphAPIの簡易的なテストを行うことができます。

graphexplorer-home-after-authorize

このエントリーをはてなブックマークに追加