LoginSignup
4
2

More than 1 year has passed since last update.

Power Automate for desktop「OAuth2.0認可フローのPKCEをやってみる」

Posted at

概要

OAuth2.0認可フローの拡張仕様PKCE(Proof Key for Code Exchange)をPower Automate for desktopを使用して手組しDataverseからデータを取得します。アプリにクライアントクレデンシャルやユーザーパスワードを保存せず、都度生成されるcode_verifierで検証しアクセストークンを要求できます。

ConvertedOAuthDataverse2.gif
※ブラウザに認証を記憶させてある状態での動きです。

参考

注意事項など

  • 挙動を確認するための学習目的です。
  • Dataverseのセキュリティ ロール設定とエンティティ設定については触れません。
  • リソースに応じて適切に設定する必要があります。
  • ブラウザにアカウント登録されていない場合、手動で認証する必要があります。
  • ブラウザに複数アカウントが登録されている場合、選択するフローを追加する必要があります。
  • 初回、権限委任する必要があります。
  • 簡素化するためidなどの設定情報はハードコーディングしています。
  • code_verifierは英数字のほか "-" "." "_" "~"が使えますが、PADのランダムテキスト生成アクションでは記号の一部だけの利用はできないため今回は使用していません。
  • 自己責任でお願いいたします。
  • 2022年10月の情報です。

Azureでアプリの登録

  • リダイレクトURIはhttp://localhost/myappとしました。
    CleanShot 2022-10-02 at 18.19.49@2x.png

  • APIアクセス許可の要求でDynamics CRM user_impersonationを許可します。
    CleanShot 2022-10-02 at 18.27.57@2x.png

概要からクライアントIDやテナントID、エンドポイントなど各種情報はコピペできます。

フロー全体図

01CleanShotflow.png

詳細

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のランダムテキスト生成アクションでは記号の一部利用はできないため今回は使用していません。

CleanShot 2022-10-02 at 20.18.44@2x.png

9.SHA256でハッシュ化します。

PADの「テキストをハッシュ化します」アクションはエンコードにASCIIを指定するとBase64エンコードされて出力されます。

CleanShot 2022-10-02 at 20.21.37@2x.png

10.URL SAFEにします

Base64エンコードされたハッシュテキストの「+」を「-」に「/」を「_」に置き換え、パディングされている場合は最後尾「=」をトリムします。PADのアクションで行うことも考えましたが「PowerShellスクリプトの実行」を使うとシンプルに行えます。

CleanShot 2022-10-02 at 20.31.14@2x.png

PowerShell
"%HashedText%".TrimEnd('=').Replace('+', '-').Replace('/', '_')

12.State生成

認可エンドポイントから正しくリダイレクトされたか確認のため一応入れました。

CleanShot 2022-10-02 at 20.36.50@2x.png

13.認可エンドポイント

CleanShot 2022-10-02 at 20.38.24@2x.png
https://login.microsoftonline.com/%tenant_id%/oauth2/authorize

14.認可エンドポイントへの接続文字列生成

code_challenge_method=S256を使います。

CleanShot 2022-10-02 at 20.40.52@2x.png

%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に戻ってくるまでループして待ちます。少し雑ですが、認証や認可が手動で求められた場合を考えてこのようにしています。
CleanShot 2022-10-02 at 20.49.12@2x.png

25.temporary codeの取得

正規表現を使ってURLからtemporary codeを取得します。

CleanShot 2022-10-02 at 20.50.44@2x.png

26〜30.stateをチェック

あらかじめ生成したstateがリダイレクトURIに戻ってきたstateと一致するかチェックします。一致しない場合はフローを終了します。

CleanShot 2022-10-02 at 20.54.19@2x.png

31〜36.Accsess Tokenの取得

CleanShot 2022-10-02 at 20.59.10@2x.png

34.「Webサービスを呼び出します」アクション

CleanShot 2022-10-02 at 21.01.29@2x.png

ハッシュ化前の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%としてトークンを含めます。

CleanShot 2022-10-02 at 21.17.10@2x.png

まとめ

  • OAuth2.0認可フローのPKCEをPower Automate for desktopでやってみました。
  • PKCEはs256 code_challengeを認可に、トークン取得時に元のcode_verifierを含めることで検証していることがわかりました。
  • このことでアプリにパスワードやクライアントクレデンシャルを持たせずになりすましや横取りを防ぐことができます。
  • Power Automate for desktopの「テキストをハッシュ化します」アクションがPKCEに使えることがわかりました。
  • 手組は大変ですが勉強になりました。
4
2
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
4
2