からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

Microsoft Ignite 2018 で Microsoft Graph のアップデートが発表されました

Microsoft Ignite 2018 でさまざまな発表がありましたが Microsoft Graph についてもアップデートがありました。詳細は Office 365 Blog で公開されています。

developer.microsoft.com

簡単にアップデートの内容を見ていきます。

Managed access to Microsoft Graph (preview)

Microsoft Graph に対する大規模なデータアクセスを行うようなアプリケーション (主に分析用を想定しているみたい) の場合に、セキュリティの問題が出てくるので、Azure Data Factory と Azure Managed Applications を使って管理されたアクセス (Microsoft Graph data connect) ができるようにしましょうというもの。Azure Data Factory と Azure Managed Applications が全然わからないのですが、いったん Microsoft Graph で取得できるデータを Blob にコピーしてアクセスさせるみたいですね。

Notifications (preview)

すべてのデバイス (Windows, iOS, Android) に通知を送るための API です。というか今まで通知 API はなかったんですね。

Dynamics is now in Microsoft Graph (preview)

Dynamics のエンドポイントが追加されました。これは恩恵を受ける人が多そうな感じがします。

Tools for IT pros & admins

PowerApps から Microsoft Graph を使うためのサンプルとテンプレートです。

Security & Identity

セキュリティまわりはよくわからないです…。

Intune

Intune の API がいろいろ増えていますよという話。

Microsoft Teams, Messages, Calendars, Files, and Folders

既存の API の拡張ですが大事なことが割とさらっと書いてあります。

Teams の新機能 タブ作成 API によりチームにタブを展開できる (preview)
通話とオンライン会議 API でボットが作成できる (preview)
SharePoint の新機能 ページ API によりページの管理ができる (preview)
リスト ビュー API によりビューの管理ができる (preview)
OneDrive の新機能 フォローしているコンテンツの管理ができる (preview)
ファイルの一括移動とコピーができる (preview)
Outlook の新機能 メッセージにカスタムヘッダーを追加できる (GA)
Mail Tips API によりメールの受信者情報の取得ができる (GA)
予定表の空き時間を取得できる (preview)

Tools & capabilities for developers (preview)

Microsooft Graph が OpenAPI (Swagger) に対応しました。これまでドキュメントを見なければならなかったので開発生産性が上がるかもしれません。

github.com

SharePoint Framework 1.6 がリリースされました

2018/09/05 に SharePoint Framework 1.6 がリリースされました。

developer.microsoft.com

大きなアップデートとしては、SharePoint Framework 1.4.1 で追加された、Microsoft Graph (MSGraphClient) および Azure Active Directory 認証で保護されたカスタム Web API (AadHttpClient) のサポートが GA (一般提供) になりました。MSGraphClient と AadHttpClient のいずれも @microsoft/sp-http に入っているようですね。
GraphHttpClient については過去の記事で紹介しています。

blog.karamem0.jp

PowerApps でパスワード マネージャーを作ってみた

パスワード管理に Enpass を使っていたのですが、ちょっと高機能すぎて使いこなせないのと、モバイルで使うときに有償になるので、PowerApps の勉強がてら自分でパスワード マネージャーを作ってみました。

データ ソース

OneDrive for Bussiness の Excel ファイルをデータ ソースにしました。本当は厳密にセキュリティを考えるならもうちょっと考えなければいけないのかもしれませんが、OneDrive for Bussiness がセキュアなので (うっかりファイルを公開していない限り) 問題ないとしています。Excel だと既定で 500 件までしか扱えないという問題もありますが、パスワードを 500 件も登録することもないので、こちらも大丈夫ですね。

一覧表示

テンプレートほぼそのままですがアイコンを上に置くとしんどいので下に移動しました。

アイテムの追加

セキュリティとして意味があるのかよくわかりませんが、第 2 認証を要求するサイトもあるので、パスワードは 2 つ入れられるようにしています。

アイテムの編集

最終更新日時は自動的に更新するようになっていますが、SubmitForm のあとに Patch を呼び出して現在時刻を突っ込むようにしました。

初期表示ではパスワードが見えませんが、ロック アイコンをクリックすることで、パスワードが見えるようになります。本当は、クリップボードにコピーするとか、テキストをすべて選択するとかしたいのですが、さすがに PowerApps の限界のようです。コピーに関しては PowerApps Community に Feedback がすでにあるようなので今後に期待したいと思います。

https://powerusers.microsoft.com/t5/PowerApps-Ideas/idi-p/32975

URL も Launch でリンクできるようにしたのですが、モバイルの場合、例えば Twitter だと、ブラウザが立ち上がるのではなく、アプリが立ち上がってしまいます。

パスワードの生成

パスワードを自動生成する機能もあります。さすがに PowerApps だけでは無理なので Flow でパスワード生成処理を実装しています。実装の詳細は @ さんにブログの情報を教えていただきました。さすが縄神様!ブログでは LogicFlow の中で長さを決めていますが、そこは PowerApps から渡すようにしています。

blogahf.blogspot.com

まとめ

簡単な業務アプリだったらモバイルの種類を問わずに簡単に開発できるのは便利だなと思いました。ちなみに調査も含めだいたい 1 日くらいで作れました。
しいて言えばできることとできないことの限界がもう少しわかりやすいといいんですけどね…。

SharePoint Framework のデプロイを自動化する

(2018/08/14 追記) 説明が足りない箇所があったため全体的に書き直しました。

2017/11 に SharePoint ALM API が提供されました。これにより、SharePoint アプリ (Add-ins) や SharePoint Framework のアプリのビルドとデプロイを自動化できるようになりました。

docs.microsoft.com

じゃあ実際やってみたらどうなるのということでやってみました。

サンプル コード

github.com

前提として gulp はインストールされている必要があります。

タスク

  • マニフェストの cdnBasePath を書き換える。
  • npm パッケージを復元する。
  • ソース ファイルをビルド (gulp bundle) する。
  • ソリューション パッケージを作成 (gulp package-solution) する。
  • ソース ファイルをアップロードする。
  • ソリューション パッケージをアプリ カタログにアップロードする。
  • ソリューション パッケージを展開する。
  • ソリューション パッケージをインストールする。

OAuth について

毎度出てくる OAuth の話。SharePoint の場合、Azure AD に登録したアプリではクライアント シークレットを使った Client Credentials Grant ができません。正確にはアクセス トークンは取得できるのですが、アクセス トークンを使って API を呼ぼうとすると「Unsupported app only token.」というエラー メッセージが返されます。

blog.mastykarz.nl

証明書を使ってもいいのですが、とても面倒なので、SharePoint で提供されている OAuth (Azure ACS に基づいた承認フロー) を使用することにします。

Granting access via Azure AD App-Only | Microsoft Docs

AppRegNew.aspx からアプリを登録します。

AppInv.aspx からアクセス許可を設定します。「AllowAppOnlyPolicy="true"」とするのがミソです。

アクセス許可を付与します。

これでクライアント シークレットを使ってアクセス トークンを取得する準備ができました。トークンを取得するときの URL は「https://login.microsoftonline.com」ではなく「https://accounts.accesscontrol.windows.net」になります。また client_id や resource に設定する値も Azure AD のお作法とは異なりますので注意が必要です。*1

*1:このあたりの実装を詳しく知りたい場合は TokenHelper.cs を確認する必要があります。

Azure Active Directory のアプリの「Web アプリ/API」と「ネイティブ」の違いについて

Azure Active Directory でアプリケーション登録をするときに「Web アプリ/API」と「ネイティブ」を選択できますが、何が違うのか忘れてしまうので、自分用メモで残しておきます。

一般的なアプリの種類と使用するフローについての説明はこちらがわかりやすいです。

www.buildinsider.net

「ネイティブ」ではクライアント シークレットを発行できない

「Web アプリ/API」の場合はクライアント シークレットを作成できます。Azure Active Directory では [設定] - [API アクセス] - [キー] の項目です。

「ネイティブ」の場合はクライアント シークレットを作成することができません。

クライアント シークレットは秘匿化しなければなりませんが、「ネイティブ」に分類される Windows アプリやモバイル アプリの場合、クライアントにアプリケーションを展開する必要があるため、クライアント シークレットを安全に保持することができません。そのため、「ネイティブ」でアプリケーションを登録した場合は、そもそもクライアント シークレットを作成することができないようになっています。

実行できるフローに制限がある

RFC 6749 で定義されている OAuth フローには以下の種類があります。

Authorization Code Grant 認証後に認可サーバーに Authorization Code を発行してもらう認可フロー。
Implicit Grant 暗黙的に Access Token を取得する認可フロー。
Resource Owner Password Credentials Grant 認証情報としてユーザー名とパスワードを使用する認可フロー。
Client Credentials Grant バックグラウンドで動作するアプリケーション向けの認可フロー。

これらのうち、Client Credentials Grant (grant_type=client_credentials) については、クライアント シークレットが必須のため、使用することができません。Client Credentials Grant は「委任されたアクセス許可」ではなく「アプリケーションのアクセス許可」が使用できるフローですが、上記の理由により、「ネイティブ」では「アプリケーションのアクセス許可」を使用できないことになります。

Authorization Code Grant にも違いがあります。「Web アプリ/API」の場合は、アクセス トークンの要求 (/oauth2/token) でクライアント シークレットが必須になります。しかし「ネイティブ」の場合は、クライアント シークレットを指定しなくともアクセス トークンの取得が可能です。Windows アプリやモバイル アプリを作っていて、アクセス トークンの要求で失敗するときに、アプリケーションの種類を間違えている可能性がありますので、注意が必要です。