OAuth 2.0「Authorization Code Grant」から「Authorization Code Grant with PKCE」への移行ガイド

7.0.0リリースにおける変更点

Moneytree SDKが提供するユーザー認可フロー「Authorization Code Grant」は7.0リリースで廃止されます。
廃止されるユーザー認可フローは「Authorization Code Grant with PKCE (Proof Key for Code Exchange)」に置換され、移行が必要になります。新しいユーザー認可フローはモバイルアプリを対象とした重要なセキュリティ改善施策が追加されており、Moneytreeが今後サポートする唯一の承認フローになります。以後判別のために従来式は「Authorization Code Grant(PKCE無し)」と表記します。
Moneytree SDK利用アプリには大変ご迷惑をおかけしますが、セキュリテイ改善のためにもSDKの更新とユーザー認可フローの移行をお願いします。

📘

セキュリティ強化

「Authorization Code Grant(PKCE無し)」は認可フローのリクエスト元を確認する方法がないため、悪意ある第三者のアプリがフローを盗聴する可能性があります。PKCEは「所有の証明」として機能して盗聴リスクを軽減します。

Android

Moneytree SDK 7.0.0 以前は「Authorization Code Grant(PKCE無し)」を使用するには設定時にリダイレクトURIを MoneytreeLinkConfiguration.Builder#redirectUri(String) で宣言することが必要でしたが、本設定は廃止されました。構成を維持したまま移行するためにはredirectUri() の呼び出しを削除するだけでそのまま継続して使用できます。

MoneytreeLinkConfiguration.Builder()
  .linkEnvironment(LinkEnvironment)
  .clientId(String)
  .scopes(vararg MoneytreeLinkScope)
  .redirectUri(String) // 廃止: PKCEを使用するには削除する
  .build()

非推奨となったフローでは、次にLinkAuthOptions のビルド時にビルダーで auth(LinkAuthFlow) を呼び出して「OAuth state」を設定することが必要でした。リリース7.0以後はPCKEがデフォルトフローとなる為 auth() 呼び出しが廃止されます。

LinkAuthOptions
  .builder()
  .forceLogout(Boolean)
  .auth(LinkAuthFlow.CodeGrant(String)) // 廃止: PKCEを使用するには削除する
  .buildAuthorize(String?) // または buildOnboarding(String) も使える

iOS

iOS版 Moneytree SDK 7.0 以前は「Authorization Code Grant(PKCE無し)」を使用するに設定時にリダイレクトURIを MTLConfiguration オブジェクトにURIを指定することが必要でしたが本設定は廃止されました。リダイレクトURIを指定せずに設定を初期化する、または設定のプロパティから削除してください。

let configuration = MTLConfiguration(
  redirectUri: String // 廃止: PKCEを使用するには削除する
)
// または
configuration.redirectUri = String // 廃止: PKCEを使用するには削除する

authorizeonboard APIの使用箇所は新しいPCKE対応APIへ差し替えてください。

// authorize

// 廃止
MTLinkClient.shared.authorizeUsingCodeGrant(
  from: UIViewController, 
  authOptions: AuthenticationOptions, 
  animated: Boolean
) { MTOAuthCredential, Error in
}

// 廃止
MTLinkClient.shared.authorizeUsingPkce(
  from: UIViewController, 
  authOptions: AuthenticationOptions, 
  animated: Boolean
) { MTOAuthCredential, Error in
}

// 新PCKE対応API
MTLinkClient.shared.authorize(
  UIViewController, 
  options: AuthenticationOptions, 
  animated: Boolean
) { MTOAuthCredential, Error in
}

// onboard

// 廃止
MTLinkClient.shared.onboard(
  from: UIViewController, 
  authorizationType: MTLinkAuthorizationType, 
  email: String, 
  state: String?, 
  region: MTAuthRegion, 
  animated: Boolean
) { MTOAuthCredential, Error in
}

// PCKE対応API
MTLinkClient.shared.onboard(
  UIViewController, 
  email: String, 
  animated: Boolean
) { MTOAuthCredential, Error in
}

独自のバックエンドを実装する際の留意点

① 「Authorization Code Grant」フローの主な用途はバックエンドに認可フローを持たせてアクセストークンを取得することでした。この機能はサーバーから直接ユーザーのデータを取得および更新するために使用されていましたが、アーキテクチャ上にセキュリティ脆弱性を含んでいました。

サーバー間で直接実行される「Authorization Code Grant」フローの安全はPCKE無しでも担保できます。アプリケーションはサーバー間通信と異なり、SDKからフローを開始することからモバイルデバイスにOAuthフローの一部要素の処理を許可しています。この場合モバイルデバイスはセキュリテイ上信頼できない第三者となり、悪意あるエンティティに傍受すリスクがあります。

「Authorization Code Grant with PKCE」は信頼できないモバイル デバイスとサーバー間の通信を保護する為に設計された機能であり、認可フローをwith PKCEに切り替えることでデバイス上のフローが保護されるようになります。

SDKのOAuthプロセス完了後にアプリは認可トークンをバックエンド サーバーに安全に送信できます。独自バックエンドを運用している場合はアクセストークンとリフレッシュトークンの2つを送信するAPIの実装が必要となります。この実装によりバックエンドはアプリから取得したトークンのペアを必要に応じて保存、使用、そしてリフレッシュすることができます。

② トークンエラーが発生した場合も対応が必要となります。一例としてバックエンドがトークンを更新しようとして失敗した場合のUX改善が可能となりました。SDKを利用しているならばエラーをアプリケーションに伝え、ユーザーに再認可のリクエストを促すエラーメッセージの表示を出してユーザの混乱を防ぎつつスムーズな行動を促すことが可能です。

上記のフローとアーキテクチャの詳細については、Moneytree LINK SDK製品・技術概要を参照してください。