質問: ### 前提・実現したいこと ネイティブアプリケーションからの API 呼び出しを OAuth 2.0 for Native Apps に従って実装することにより、 OAuth/OpenID Connect の認可・認証に基づいたアクセス制御を実装したい。 ここで、ネイティブアプリケーション(以降、アプリと呼びます)とは、スマホにインストールされる非Webのアプリケーションであり、カスタムURIスキームを使用して Web での認証結果を取得するものであるとします。 ### 脅威 認証・認可を要求しているアプリが本物であるかどうかを確認する手段がなく、偽物のアプリから正しい手順に従って認証・認可を要求されると、ユーザのアクセストークンを取得されてしまう。 ### 攻撃方法 たとえば、悪意のある第3者が本物アプリをハッキングして client_id と client_secret が盗むことに成功したとします。この第3者がアクセストークンを盗む目的でアプリを開発し、 Play store に登録し、何らかの方法でユーザを騙してインストールさせたとします。 このアプリは本物と全く同じ手順で認証要求を発行するので、アクセストークンを取得できると思われます。偽アプリで取得したアクセストークンを別サーバに送るように作っておけば、そのアクセストークンを使ってAPIにアクセスでき、アカウントを乗っ取ることができるように思われます。 ### 試したこと OAuth 2.0 for Native Apps では、Proof Key for Code Exchange by OAuth Public Clientsに従って、実装することで、認証コードが途中で盗まれるのを防いでいます。しかし、もともと認証を要求しているアプリ自身が偽物である場合は、アクセストークンが盗まれるのを防げないのではないかと思われます。
回答: 残念ながら、どうしようもないでしょう。 実際、(あえてリンクすることはしませんが)Twitter公式アプリのClient ID/Client Secretすら流出している始末です。