Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

間欠動作するアプリケーションむけActive Directoryアクセストークンの保存方法の検討

OutlookSharePointAPI、バックグラウンドのアプリケーションで使おうとするとすぐ管理者の同意が必要なPermissionを求めてくる。 たとえばバックグラウンドアプリから自分のOneDriveへファイルをアップロードしたい場合、Azure Active DirectoryFiles.ReadWrite.Allのアクセス許可を与える必要がある。

https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_put_content?view=odsp-graph-online

しかし、このアクセス許可には管理者の同意が必要なので、組織内の一般的なユーザでは権限を付与できない。たとえば、ファイルを定期的にOneDriveへアップロードする程度の処理でも管理者の同意が必要なので、現実的には利用できないことが多そう。

妥協案として、OneDrive PowerShell Module を使えば、認証の都度ウィンドウを開いてアプリケーションの認証を行うことはできる。いちど認証が行えれば、1時間に1度トークンをリフレッシュする限り、シークレットキーの有効期限(最大2年)まではアクセストークンを使いつづけられる。

さて、ここで問題なのは取得したアクセストークン・リフレッシュトークン・IDトークンをどこに格納しておくか?という話である。起動後ずっと動きつづけるデーモンのようなアプリケーションであれば、OSをシャットダウンしない限りはトークンが有効であり続けるので、動きつづけるVMか何かのうえでアプリケーションを動かしつづければよい。

問題は間欠的に動作するアプリケーションで、たとえばOSのタスクスケジューラから10分に1回起動され、自分のPCのスクリーンショットを取得してOneDriveへアップロードする……といった処理がこれにあたる。この場合、いちど取得したトークンを、アプリケーションの終了後もどこかに保存しておく必要がある。個人のPCであればローカルファイルに保存しておけばよいのだが、富士通瞬快/セルフメンテナンスシステムHD革命/WinProtectorを使っている環境では通常のファイルに保存した情報は削除されてしまうおそれがある。

保存先の候補としては、Windowsレジストリを使う方法がまず思いつくが……