概要
OAuth2.0認可フローの拡張仕様PKCE(Proof Key for Code Exchange)をPower Automate for desktopを使用して手組しDataverseからデータを取得します。アプリにクライアントクレデンシャルやユーザーパスワードを保存せず、都度生成されるcode_verifierで検証しアクセストークンを要求できます。
参考
注意事項など
- 挙動を確認するための学習目的です。
- Dataverseのセキュリティ ロール設定とエンティティ設定については触れません。
- リソースに応じて適切に設定する必要があります。
- ブラウザにアカウント登録されていない場合、手動で認証する必要があります。
- ブラウザに複数アカウントが登録されている場合、選択するフローを追加する必要があります。
- 初回、権限委任する必要があります。
- 簡素化するためidなどの設定情報はハードコーディングしています。
- code_verifierは英数字のほか "-" "." "_" "~"が使えますが、PADのランダムテキスト生成アクションでは記号の一部だけの利用はできないため今回は使用していません。
- 自己責任でお願いいたします。
- 2022年10月の情報です。
Azureでアプリの登録
概要からクライアントIDやテナントID、エンドポイントなど各種情報はコピペできます。
フロー全体図
詳細
1~6 各種設定情報
resourceはDataverseのWebAPIエンドポイントです。過去記事に書きました。
8~10 S256 code_challengeの生成
PKCE S256の仕様
S256
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
8.code_verifierを生成
「ランダム テキストの作成」アクションを使って43~128文字のcode_verifierを生成します。
code_verifierの仕様では本来、英数字のほか "-" "." "_" "~"が使えます。しかしPADのランダムテキスト生成アクションでは記号の一部利用はできないため今回は使用していません。
9.SHA256でハッシュ化します。
PADの「テキストをハッシュ化します」アクションはエンコードにASCIIを指定するとBase64エンコードされて出力されます。
10.URL SAFEにします
Base64エンコードされたハッシュテキストの「+」を「-」に「/」を「_」に置き換え、パディングされている場合は最後尾「=」をトリムします。PADのアクションで行うことも考えましたが「PowerShellスクリプトの実行」を使うとシンプルに行えます。
"%HashedText%".TrimEnd('=').Replace('+', '-').Replace('/', '_')
12.State生成
認可エンドポイントから正しくリダイレクトされたか確認のため一応入れました。
13.認可エンドポイント
https://login.microsoftonline.com/%tenant_id%/oauth2/authorize
14.認可エンドポイントへの接続文字列生成
code_challenge_method=S256を使います。
%auth_endpoint%?resource=%resource%&response_type=code&client_id=%client_id%&state=%state%&scope=%scope%&redirect_uri=%redirect_uri%&code_challenge=%code_challenge.Trimmed%&code_challenge_method=S256
17〜23ブラウザで認証認可を実行
リダイレクトURIに戻ってくるまでループして待ちます。少し雑ですが、認証や認可が手動で求められた場合を考えてこのようにしています。
25.temporary codeの取得
正規表現を使ってURLからtemporary codeを取得します。
26〜30.stateをチェック
あらかじめ生成したstateがリダイレクトURIに戻ってきたstateと一致するかチェックします。一致しない場合はフローを終了します。
31〜36.Accsess Tokenの取得
34.「Webサービスを呼び出します」アクション
ハッシュ化前のcode_verifierをbodyに含めPOSTします。
grant_type=authorization_code&code=%code%&redirect_uri=%redirect_uri%&code_verifier=%code_verifier%&client_id=%client_id%
コンテンツタイプをapplication/x-www-form-urlencoded
にします。
要求本文をエンコードしない設定にします。
デフォルトでオンになっているので注意が必要です。
38.取得できたアクセストークンを使ってらDataverseに試してみます。
ヘッダーにAuthorization:Bearer %token%としてトークンを含めます。
まとめ
- OAuth2.0認可フローのPKCEをPower Automate for desktopでやってみました。
- PKCEはs256 code_challengeを認可に、トークン取得時に元のcode_verifierを含めることで検証していることがわかりました。
- このことでアプリにパスワードやクライアントクレデンシャルを持たせずになりすましや横取りを防ぐことができます。
- Power Automate for desktopの「テキストをハッシュ化します」アクションがPKCEに使えることがわかりました。
- 手組は大変ですが勉強になりました。