LoginSignup
1
0

More than 5 years have passed since last update.

Microsoft Graph を使ってみよう : 拡張

Last updated at Posted at 2018-05-22

拡張を利用するシナリオ

Microsoft Graph は Azure AD や Office 365 といった、社内の情報が集約されている場所です。そこに独自のデータを含めることにより、それらの情報も一元的に管理が行え、複数の場所から同じ手法でアクセスできるようになります。

例えば以下のようなシナリオがあります。

  • 追加のユーザープロファイル
  • 社内アプリケーションで使う設定やデータ
  • レポートで活用できる独自のデータ

拡張の種類

Microsoft Graph には 2 種類の拡張方法があります。

オープン拡張
スキーマを持たないデータを格納できます。簡単なデータを持たせるのに最適です。

スキーマ拡張
型指定されたデータを格納できます。スキーマがあるため、フィルターなども利用することが出来ます。

それぞれの拡張がサポートされるリソースは、現時点では以下の通り。

リソース オープン拡張機能 スキーマ拡張機能
管理単位 プレビューのみ プレビューのみ
予定表イベント GA GA
デバイス GA GA
グループ GA GA
グループ予定表イベント GA GA
グループ会話の投稿 GA GA
メッセージ GA GA
組織 GA GA
個人用連絡先 GA GA
ユーザー GA GA

随時更新されるため、利用する際に サポートされているリソース を参照。

オープン拡張を試す

ここでは独自アプリで使うためのローミングプロファイル情報を、ユーザーに格納してみます。
また名前を固有にするために "com.onmicrosoft.graphdemo01.roamingSettings" という名前を使います。

1. Graph エクスプローラーにアクセスして、組織アカウントでサインイン。POST メソッドで以下のようにリクエストを作成して実行。

POST: https://graph.microsoft.com/v1.0/me/extensions

Body
{
    "@odata.type":"microsoft.graph.openTypeExtension",
    "extensionName":"com.contoso.roamingSettings",
    "theme":"dark",
    "color":"purple",
    "lang":"Japanese"
}

2. 追加した情報を取得するために、以下クエリを実行。select クエリに id を含め、かつ $expand=extensions の指定で情報が取得可能。

GET: https://graph.microsoft.com/v1.0/me?$select=id,displayName&$expand=extensions

応答

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users(id,displayName,extensions)/$entity",
    "id": "6746d79d-8c77-4eec-a61f-cce6beb162f7",
    "displayName": "中村 憲一郎",
    "extensions@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('6746d79d-8c77-4eec-a61f-cce6beb162f7')/extensions",
    "extensions": [
        {
            "@odata.type": "#microsoft.graph.openTypeExtension",
            "theme": "dark",
            "color": "purple",
            "lang": "Japanese",
            "extensionName": "com.contoso.roamingSettings",
            "id": "com.contoso.roamingSettings"
        }
    ]
}

3. 拡張名を指定して DELETE を実行すると削除可能。

DELETE https://graph.microsoft.com/v1.0/me/extensions/{name}

Capture.PNG

4. 他のユーザーの情報を格納する場合、以下のようにアドレスを /users/ に変更。

POST: https://graph.microsoft.com/v1.0/users/{id}/extensions

Capture.PNG

5. 結果を確認。

https://graph.microsoft.com/v1.0/users?$select=id,displayName&$expand=extensions
Capture.PNG

SDK を使う場合

オープン拡張の追加

C#
var openTypeExtension = new OpenTypeExtension()
{
    ExtensionName = "com.onmicrosoft.graphdemo01.roamingSettings",
    AdditionalData = new Dictionary<string, object>()
    {
        { "theme","dark"},
        { "color", "purple"},
        { "lang","Japanese"}
    }
};

var openExtensionResponse = await graphClient.Me.Extensions.Request().AddAsync(openTypeExtension);

拡張データの取得

C#
await graphClient.Me.Extensions.Request().GetAsync();

Capture.PNG

拡張の削除

C#
await graphClient.Me.Extensions[openExtensionResponse.Id].Request().DeleteAsync();

スキーマ拡張を試す

スキーマ拡張は現在 Graph エクスプローラーからは試せないため、C# のプログラムを使って試します。以下のスキーマ拡張を追加します。

  • User リソースに対して追加
  • myextension という名前を利用

1. まず拡張用のクラスを定義。

C#
public class schemaExtentionClass
{
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
}

2. 次にスキーマ拡張を作成。

C#
SchemaExtension extensionDefinition = new SchemaExtension()
{
    Description = "My first extension",
    Id = $"myextension",
    Properties = new List<ExtensionSchemaProperty>()
    {
        new ExtensionSchemaProperty() { Name = "id", Type = "Integer" },
        new ExtensionSchemaProperty() { Name = "name", Type = "String" }
    },
    TargetTypes = new List<string>()
    {
        "User"
    }
};

SchemaExtension schemaExtension = await graphClient.SchemaExtensions.Request().AddAsync(extensionDefinition);
Console.WriteLine(schemaExtension.Id);

3. プログラムの実行後、Id を確認。

Capture.PNG

4. 拡張ができたら Graph エクスプローラーに戻って、自分のユーザーに PATCH を実行。

Capture.PNG

5. 以下のクエリで結果を確認。

GET: https://graph.microsoft.com/v1.0/me?$select=id,displayName,exthejv6jgb_myextension
Capture.PNG

6. 拡張名を指定して DELETE を実行すると削除。

DELETE: https://graph.microsoft.com/v1.0/schemaExtensions/exthejv6jgb_myextension
Capture.PNG

データの追加、取得、削除は SDK でも当然実行できます。

User オブジェクトの AdditionalData に追加。

C#
var me = await graphClient.Me.Request().GetAsync();
me.AdditionalData = new Dictionary<string, object>()
{
    { schemaExtension.Id, new SchemaExtentionClass() {  Id = 123, Name = "123"} }
};

await graphClient.Me.Request().UpdateAsync(me);

明示的にスキーマ拡張 ID を指定して取得。

C#
me = await graphClient.Me.Request().Select(schemaExtension.Id).GetAsync();

Capture.PNG

ID を指定して削除

C#
await graphClient.SchemaExtensions[schemaExtension.Id].Request().DeleteAsync();

まとめ

拡張機能が使えることで、既存のデータのやり取りだけではなく、独自データを格納できるデータベース的な使い方が出来るようになりました。新規のリソースは作れませんが、関連しそうなデータを入れて活用してください。

目次へ戻る

参照

拡張機能を使用してカスタム データをリソースに追加する
オープン拡張機能の使用 (例)
スキーマ拡張機能の使用 (例)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0