からめもぶろぐ。

CSOM 完全に理解した

Global Office 365 Developer Bootcamp 2018 Japan に登壇しました

2018/10/27 に開催された Global Office 365 Developer Bootcamp 2018 Japan で Microsoft Graph のハンズオンの担当で登壇しました。

connpass.com

当日は資料や事前準備の不備があり申し訳ありませんでした。内容をコピペしたい場合は PDF は向かないですね…。でも後からツイートを見てみたらちゃんとできてる方もいたようでホッとしております。

ハンズオン中ご質問をいくつかいただきましたので補足しておきます。

アプリの変更が反映されない

反映されるのに時間がかかることがあります。開発中はそれだと大変なので Azure ポータルの [Azure Active Directory] - [エンタープライズ アプリケーション] - [概要] から一度削除してしまうことをお勧めします。この場合、テナントでのアプリの設定が削除されるだけなので、アプリそのものが削除されるわけではありません。


アクセス許可の同意は一度行うと保持されるのか

されます。ユーザーが同意したかどうかは Azure ポータルの [Azure Active Directory] - [エンタープライズ アプリケーション] - [アクセス許可] で確認することができます。


アクセス許可の画面に出てくる「組織の代理として同意する」について

最近のアップデートのようですが、管理者の場合はアクセス許可の画面で「組織の代理として同意する」ができるようになりました。これまで AdminConsent は
https://login.microsoftonline.com/common/adminconsent でやっていたのですが、その手間が省略できることになります。

もちろん一般ユーザーではこのチェックボックスは表示されません。

Azure Active Directory の新しいアプリの登録 (プレビュー) が提供されたようです

Azure ポータルの Azure Active Directory に「アプリの登録 (プレビュー)」が追加されてました。一瞬「https://apps.dev.microsoft.com があるじゃん!」って思いましたが、あくまで v1 のアプリの登録の新しいバージョンですね。

アクセス許可あたりはいままでよりずっと見やすくなってますね。

Azure Active Directory の OAuth v2.0 で Device Flow が使えるようになりました

すっかり情報を見落としていたのですが、MSAL.NET 2.2.0 が 2018/10/5 にリリースされ v2.0 で Device Flow がサポートされるようになりました。*1

github.com

UI を出せないアプリケーションでは (Password Credentials を使うという手もなくはないですが) この機能は必須なので、これまで仕方なく v1.0 を使っていたアプリケーションでも、v2.0 に移行できるようになるのでありがたいですね。

ちなみに Fiddler で中身をのぞいてみました。ちゃんと /oauth2/v2.0/devicecode になっていますね。

*1:なお 2018/10/24 時点での最新は 2.3.0 です。

Office 365 日本リージョンで Microsoft Graph data connect を実行するとエラーになる

ここ数日 Microsoft Graph data connect を試そうと思っていろいろやってみたのですがどうにもうまくいかないということで。

現在 OfficeDev の GitHub リポジトリにはセットアップの手順とサンプルの ARM Template が公開されています。

github.com

また microsoftgraph の GitHub リポジトリにはトレーニング用のコンテンツが公開されています。

github.com

頑張って英語を読み解きながらどちらの手順を試してみたもののできませんでした。発生したエラーについては以下の通り。Office 365 への承認までは通るのですがその後で固まってしまう感じ。

Error: Office365 data loading failed to execute. Failed to extract data from Office 365 for Tenant and dataset BasicDataSet_v0.Contact_v0 into AzureBlobStorage

仕方がないので開発チームにメールを投げてみることに。次の日には返事がきました。どうも Office 365 のリージョンと Blob Storage のリージョンの組み合わせが正しくないとエラーになるとのこと。

github.com

そして日本リージョンがない件。さらに突っ込んで聞いてみたところ、日本リージョンではまだサポートされておらず、2019 年前半には日本 (Office 365) - 東日本 (Azure) で使えるようになるそうです。それまではアジア太平洋 (Office 365) - 東南アジア (Azure) を使って欲しいとのことでした。とりあえず日本で試すことができるのはまだまだ先のようですね。

Microsoft Graph でも SharePoint リスト アイテムの複数の値を持つ列が更新できない

SharePoint REST API の時代からですが複数の値を持つ列 (MultiChoice、UserMulti、LookupMulti) を更新できないという問題がありました。英語フォーラムの情報を見てもできるという情報もあったりできないという情報があったりして錯綜しているのですが、少なくとも私が試した限りでは解決できていません。

具体的には以下のようなリクエストを投げると

POST https://example.sharepoint.com/_api/web/lists('<ListId>')/items(<ItemId>)
Authorization: Bearer <AccessToken>
Accept: application/json; odata=verbose
Content-Type: application/json; odata=verbose

{
    "__metadata": {
        "type": "SP.ListItem"
    },
    "ChoiceField": {
        "results": [
            "Test Value"
        ]
    }
}

400 エラーが返ってきます。*1

Microsoft.SharePoint.Client.InvalidClientQueryException: A value without a type name was found and no expected type is available. When the model is specified, each value in the payload must have a type which can be either specified in the payload, explicitly by the caller or implicitly inferred from the parent value. *2

これ Microsoft Graph で改善してるのかなと思ってふと試したところ全然治っていないみたいです。

{
    "error": {
        "code": "-1, Microsoft.SharePoint.Client.InvalidClientQueryException",
        "message": "A value without a type name was found and no expected type is available. When the model is specified, each value in the payload must have a type which can be either specified in the payload, explicitly by the caller or implicitly inferred from the parent value.",
    }
}

まあ Microsoft Graph は SharePoint REST API をラップしているだけなので当たり前といえば当たり前なのですが、悲しい気持ちになりましたというお話。

*1:ちなみに例外として null を入れると 200 が返ってきます。つらい。

*2:型名のない値が見つかりましたが、使用できる必要な型がありません。モデルが指定されている場合、ペイロード内の値ごとに、ペイロードで指定できる型が必要です。その型は、呼び出し元による明示的な型か、親値から暗黙的に推定される型にすることができます。