You’re probably dealing with this already. The app login works, users can sign in with Google, Microsoft, or email, and the API accepts a token. Then the core questions begin. Can this user see invoices from another account? Should the desktop app cache an access token locally? How do you handle consent in a Capacitor build without leaking state across the webview and native layer?
That’s where app authorization stops being a checkbox and starts affecting product trust, incident response, and app store review outcomes. In cross-platform apps, especially with Capacitor and Electron, the tricky part isn’t understanding the idea of authorization. It’s implementing it in places where browser assumptions no longer hold, secure storage behaves differently per platform, and shortcuts on the client create server-side risk.
目次
- アプリ認証の本当の意味
- 認証の基本構成要素
- 一般的な認証モデルとプロトコル
- OAuth 2.0のフロー構造
- セキュリティの脅威と不可欠なベストプラクティス
- 実装パターン: Capacitor と Electron
- セキュアなアプリ認証への道
アプリ認証とは何を意味するか
ユーザーがアプリをインストールし、「Googleで続行」をタップし、サインインに成功し、次にコンセント画面が表示され、ユーザーがアプリが連絡先やカレンダーデータを読むことを許可するかどうかを確認する。 その瞬間には、両方のアクセスストーリーが含まれています。サインインはユーザーのアイデンティティを確認します。コンセント画面は、アイデンティティがわかっている後、アプリが実行できることを定義します。
チームが混乱するのは、まだその区別が理解できていないからです。 認証 ユーザーのアイデンティティを証明する 認証 どのユーザー、セッション、またはアプリがアクセスできるかを決定します。IDは建物に入るのに必要です。キーはどのドアを開けるかを決定します。
アプリの作業では、その違いは重要です。チームはログインフローを保護し、次にそれ以降のすべてのものを設計不足にします。彼らはトークンに過度に信頼し、サーバー側の許可チェックをスキップしたり、クライアントがアクセス規則を制御するのを許したりします。その結果、「ユーザーがログインしている」は「ユーザーがアクセスできるものが多すぎる」というものに変わります。
認証は信頼が実際に形になる場所です。ユーザーは、アプリが自分が誰であるかを知っていることだけではなく、それが彼らが承認したものだけに触れることを確実にしたいと考えています。
3 つの役割を区別する必要があります:
- ユーザー ログインし、同意を与える可能性があります。
- アプリケーション ユーザーの behalf でアクセスを要求します。
- リソース オーナーまたは API データを保護し、決定を強制します。
実際には、アプリの認証は、より強力なアクセス制御である MFA と重なることもあります。2023 年 1 月以降、 世界中で約66%のユーザーがMFAを使用していた、そして 2024年のJumpCloudの調査で、1,000を超えるSMEのITプロフェッショナルがすべての会社のリソースへのアクセスにMFAを必要としていたことが83%で明らかになった JumpCloudのMFA統計のまとめ である。実際、MFAは認証を置き換えるものではなく、最初にアクセスを要求する人を決定する基準を上げるものだ。
チームがロール、スコープ、委任アクセスを整理している場合、この記事で議論されている実装の選択肢の補完となる アプリケーションへのアクセス管理のパターン の概要は役に立つだろう。
認証の基本構成要素
認証はトークンの中で魔法のように扱うのではなく、ホテルのキー カードを考える方が簡単だ。
ホテルのキー カードは良いメンタルモデルだ
ゲストはフロントデスクに歩き、身分証明書を提示します。ホテルはゲストの身元を確認し、滞在記録を作成し、キーカードを発行します。カードはドアが開かれるたびにゲストの身元を証明するものではありません。カードには、特定の場所へのアクセスを一定期間にわたって許可する権限が記載されています。
あなたのアプリは同じように動作します。

ソフトウェアでは、カードがロックを開くべきかどうかをチェックするシステムが必要です。それがあなたのAPIゲートウェイ、バックエンドミドルウェア、ポリシーエンジン、またはサービスレベル認証レイヤーです。
実際のシステムで重要な用語
メインユーザー
アクセスを要求しているアクター。通常はユーザーですが、デバイス、バックグラウンドジョブ、またはサービスアカウントでもあり得ます。
リソース
データが保護されているもの。プロジェクト、請求書、管理ルート、ファイル、API エンドポイント、またはデータベース内の 1 つのレコード。
スコープ
リクエストされているアクションのセットです。プロフィールを読み取ります。ファイルをアップロードします。請求管理を実行します。スコープは狭く理解しやすいものでなければなりません。
同意
ユーザーの承認されたアクセス権のレベル。良質な同意画面では、リクエストを明確に表示しますが、悪質なものではすべての情報を要求します。
アクセストークン
リソースサーバーに認証が成功した後、クライアントが提示する資格情報。機密情報として扱う必要があります。
実装上の多くのミスは、すべての情報を単一の仮定に圧縮することから生じます:“ユーザーはトークンを持っているので、許可してください。” しかし、実際の運用ではその仮定は立つものではありません。トークンは有効であるかもしれませんが、現在のアクション、テナント、環境、リソースに対して不正確である可能性があります。
モバイルとデスクトップチームの場合、トークンハンドリングには特別な注意が必要です。ストレージは認可システムの一部であり、クライアントがアクセスアーティファクトを無責任に保存すると、ポリシー設計が後で救いようがないことになります。このガイド モバイル開発者向けのセキュアなトークンストレージのガイド 持続可能なルールは単純です。認証、同意、トークン発行、サーバー側の強制は、頭の中と__CAPGO_KEEP_0__で分離してください。チームがこれらを統合すると、権限に関するバグを間違ったレイヤーでデバッグすることになります。
A durable rule is simple. Keep authentication, consent, token issuance, and server-side enforcement separate in your head and in your code. Teams that merge them usually end up debugging permission bugs in the wrong layer.
チームが「OAuthを使用している」と言っている場合、実際には同時に複数の異なることを意味していることがよくあります。その混乱の原因です。プロトコルと認可モデルは異なる問題を解決します。
プロトコルは会話を取り扱います
OAuth 2.0
OAuth 2.0 は、委任された認証について主に取り扱っています。 それは、ユーザーのパスワードを直接処理せずに、ユーザーの代わりに行動する許可を求め、受け取る方法を定義します。
OpenID ConnectOpenID Connect、またはOIDCはOAuth 2.0の上に構築されており、アイデンティティ情報を追加しています。実際には、OAuthは「このアプリが何ができるか」ということを答えます。OIDCは「誰がログインしたか」ということを答えます。
That difference matters in Capacitor and Electron apps because many bugs start with using an ID token where an access token is expected, or assuming that successful sign-in means the API should grant every downstream action. It shouldn’t.
この機能をハイブリッドアプリに組み込む場合は、ステップバイステップの OAuth2 implementation guide for Capacitor apps は、避けられる流れのミスを防ぐのに役立つようなリソースです。
モデルは、決定論を処理します。
あなたのシステム内では、許可が与えられるかどうかのルールが必要です。それが RBAC そして ABAC ようこそ。
ロールベースのアクセス制御(RBAC) ロールに基づいて権限を割り当てます。管理者、編集者、サポートエージェント、またはビューアなどのロールです。理解しやすく、監査しやすく、比較的安定しているため、よく使われます。 セキュアな認証と認可についてのBrightSecの議論, RBACは、細かい権限を強制するために業界標準のメカニズムです。BrightSecが引用した証拠によると、階層構造のロールと定期的な権限監査を実施することで、RBACを実装すると、企業環境ではセキュリティインシデントが40%減少することがわかりました。 属性ベースのアクセス制御(ABAC).
属性を使用して決定を下します。部門、デバイスのポーズ、レコードの所有権、アカウントの階層、地理、リクエストの時間、またはセッションがMFAを通過したかどうかなどです。ABACは表現力が高いですが、ポリシーをよくドキュメントしないと、不透明になる可能性があります。 実践的なルール:
RBACを使用して、権限が安定し、人間が読みやすい場合に始めましょう。実際に決定を変える場合にのみ、ABACを追加してください。 RBACとABACの比較
__CAPGO_KEEP_0__
| 基準 | ロールベースのアクセス制御 (RBAC) | 属性ベースのアクセス制御 (ABAC) |
|---|---|---|
| 基本概念 | ロールに基づいてアクセスが許可される | 属性を評価してアクセスが許可される |
| 最適な選択 | 内部ツール、ダッシュボード、アドミンパネル | マルチテナントアプリ、規制されたワークフロー、コンテキスト依存のアクセス |
| 推論の容易さ | チームや監査員にとって理解が容易 | 柔軟性が高くて、デバッグが難しい |
| 管理の変更 | ロールの追加または変更 | ポリシーと属性ルールの調整 |
| 一般的なエラーのモード | ロールのスプレッド | ポリシーと隠れたエッジケースのスプレッド |
| 例 | 「サポートエージェントはチケットを表示できます」 | 「サポートエージェントは、現在の shift の間に、地域内のアカウントのチケットを表示できます」 |
最も高度なモデルを選択するための賞はありません。チームが一貫して適用できる方が良い選択です。ほとんどの製品コードベースでは、広範なアクセス境界と、例えば所有権、テナント、またはデバイス状態などのターゲット属性を使用するRBACが適しています。
OAuth 2.0 フローの解剖学
OAuth の説明は長すぎて、実際のアプリケーションでは、特に Capacitor と Electron アプリケーションなどのパブリック クライアントでは、シーケンスが重要です。クライアント シークレットを安全に保つことができないためです。
ユーザーがログインボタンをタップしたときのこと
A user opens your Capacitor app and taps “Login with GitHub.” The app creates a PKCE code verifier and a derived code challenge, then sends the user to the authorization server in a system browser or secure browser tab. The app also includes state so it can verify the response belongs to the request it initiated.

認証サーバーでは、ユーザーが必要に応じてサインインし、要求されたアクセスを承認します。サーバーは、認証コードcodeを含むリダイレクトを実行し、直接使用できる長期的な資格情報を含まないようにします。アプリは、構成済みのリダイレクトURIを通じてそのcodeを受け取ります。
アプリは、codeをトークンに交換します。PKCEはこのプロセスで重要です。アプリは、元のcode検証器と認証コードcodeを送信します。サーバーは、以前のcodeチャレンジと比較します。検証器とチャレンジが一致すると、トークン交換が成功します。検証器がなければ、codeが取得された場合、交換は失敗します。
PKCEは、ネイティブおよびハイブリッドクライアントにとって不可欠です。これらのアプリはパブリッククライアントです。攻撃者は、パッケージを検査したり、codeパスを逆アセンブルしたり、ローカル状態を改ざんしたりする可能性があるため、攻撃者はこれらのアプリを信頼できません。PKCEは、リダイレクトベースフローの最も一般的なリスクの1つを軽減します。
実装する前に、codeでシーケンスを実装する前に、視覚的なリフレッシュを得たい場合は、以下の簡単なウォークスルーを参照してください。
クロスプラットフォームアプリは通常ここで壊れます
プロトコルは簡単です。実装はしばしばそうではありません。
Capacitor アプリは通常、次のいずれかの場所で失敗します:
- システムブラウザではなく、埋め込まれたウェブビューを使用してサインインすることです。その結果、予想されるセキュリティ境界が損なわれ、不一致のクッキー動作が生じる可能性があります。 リダイレクト状態を失うことです。
- アプリがブラウザからネイティブシェルに戻る際に、状態を保持できなくなります。 トークンを平文のブラウザストレージに保存することです。
- プロジェクトはWebアプリとして始まり、チームはモバイル向けにストレージを再検討しなかったためです。 Electron アプリには別の問題が存在します。チームはレンダラー プロセスが認証ロジックを扱うことが多く、厳格な境界なしでトークンを IPC によって公開することもあります。また、デスクトップ アプリを信頼できる環境として扱うこともありますが、それではありません。パッケージ化されたデスクトップ アプリは、敵対的なクライアントの視点を持つ必要があります。
リフレッシュ動作も、意図的な設計が必要です。アクセストークンは期限切れになり、セッションはきれいに回復し、複数の並行リクエストに対してリフレッシュロジックが競合条件を生じないようにする必要があります。この
セキュアなトークン リフレッシュ フロー ガイド は、リトライ ループや古いセッションの混乱に陥かないように、ビルドする際の参考になります。 セキュアなトークン リフレッシュ フロー ガイド
1 つの実装慣行はほとんどのものよりも役に立つ。 OAuth ハンドシェイクを小さな認証モジュールに分離し、明示的な入出力を持たせる。 コンポーネント、フック、ランダムなネットワークユーティリティにリダイレクトハンドリング、トークンパーシング、リフレッシュロジックを散らばらせない。
Security Threats and Essential Best Practices
Authorization のバグは code のレビューで劇的に見えにくい。 それらは便利さのように見える。 広範囲のスコープ、キャッシュされたトークン、UI がボタンを隠すためサーバー側のチェックを省略する。 その短絡がアプリがリリースされると攻撃面となる。
The failures that keep showing up
モバイルエコシステムは有用な警告サインを提供する。 DeepStrike のモバイルセキュリティ統計によると, 95% のテスト済みモバイルアプリは認証と認可に関連する OWASP MASVS コントロールのいずれかで失敗した、 85% の分析したモバイルアプリにセキュリティの欠陥が含まれていた。 セキュリティのマーケティングのフレーミングをすべて受け入れる必要はなく、セキュリティの基本的な信号を受け取ることはできる。 認可のミスは一般的である。

そのパターンはよく知られている:
- 漏洩されたトークン 不正確なストレージ、ログ、クラッシュレポート、またはレンダラーにアクセス可能な状態から
- スコープが広すぎる すべてを要求するのは、時間の経過とともに同意を進化させることよりも簡単だからです。
- クライアント側の強制 アプリが非承認されたアクションを隠すが、APIはそれらを受け入れる
- 再生とリダイレクト攻撃 状態、PKCE、またはリダイレクト URI の検証が粗雑な場合
- 許可のずれ チームがロールと例外を追加し、定期的なレビューが行われていない場合
あなたのバックエンドがすべての保護されたアクションで認証を検証していない場合、認証アプリはありません。UI のヒントしかありません。
実用的なチェックリストで通用する
最小特権原則をデフォルトとして使用し、後でクリーンアップ作業としてではなく。実際のプロジェクトでは、各トークンが実行できる機能を縮小し、各トークンが存在する場所を縮小し、各資格情報が有効な期間を縮小します。
- 狭いスコープを要求する: 必要な機能のみを使用中のユーザーに要求する。アプリがconsentを遅らせることができる場合は、そうなしてください。
- サーバーで強制する: クライアントを信頼できないものとして扱う。ボタン、ルート、非表示の画面は、セキュリティの境界ではありません。
- プラットフォームの安全なストレージを使用する: モバイルでは、ネイティブのキーチェーンまたはキーストアへのアクセスをプラグインを通じて使用するのではなく、平文のローカルストレージを使用する。デスクトップでは、敏感な情報を容易にアクセスできるレンダラーから外す。
- 状態とリダイレクトハンドリングの検証: 認証応答は、ユーザーが実行したリクエストと一致する必要があります。
- 積極的に期限切れにして、慎重に更新する: 短期間のアクセストークンは、漏洩した場合のダメージを制限します。リフレッシュロジックは、きれいに回転し、クローズドで失敗するようにする必要があります。
- 必要に応じて削除する: セッション終了とインシデント対応には、トークンを無効化し、再認証を強制する機能が含まれます。
- 入力の検証と輸送の保護: HTTPS、適切な証明書固定、入力検証はすべて重要です。なぜなら、認証が隣接する弱点を通じて回避される可能性があるからです。
ストアを通じてアプリを配信するチームにとって、認証設計はまたAPIの露出と合規性のレビューと交差します。このAPIのセキュリティ基準の概要は、認証チェックリストとよく合致します。 API セキュリティ基準の概要 アプリ ストアの合規性のためには適切な __CAPGO_KEEP_0__ セキュリティ基準
最後に、注意しておくべき点が 1 つあります。最小限の特権は、内部ツールにも適用されます。管理パネル、サポートコンソール、ステージングアプリは、会社の中で最も緩い制御を持ち、最も敏感なアクションを公開することがよくあります。
Capacitor と Electron の実装パターン
クロスプラットフォーム アプリの認証は、ブラウザと追加のパッケージングだけのアプリであると仮定しながら進めると簡単になります。Capacitor と Electron は、ネイティブ ストレージ、プロセス境界、リダイレクト ハンドリングを尊重するパターンが必要です。

Capacitor のパターン
Capacitor を使用するには、システムブラウザ OAuth に対応し、PKCE と適切なディープリンクまたはアプリリンクコールバックをサポートするプラグインまたは認証ライブラリを使用してください。ライブラリとして capacitor-oauth2 codeを削除することができますが、多くのアダプタを削除することと同じですが、トークンストレージとリフレッシュの動作を明示的に維持する必要があります。
実用的な構造は次のようになります。
- 認証コーディネーター: ログインを開始し、状態を追跡し、コールバックを処理します。
- トークンサービス: ネイティブのセキュアストレージを通じてトークンを保存し、ブラウザストレージを使用しません。
- APIクライアント: アクセストークンを付加し、リフレッシュに一度リトライし、回復不能な失敗の場合に強制的にサインアウトします。
- ポリシー認識のバックエンド: トークンCLAIMをサーバーサイドの認証チェックにマップします。
また、ハイブリッドアプリライフサイクルに合ったセッションツールも必要です。セッション管理層のオプションを評価している場合、__CAPGO_KEEP_0__のセキュアセッションマネージメント用プラグインも検討してください。 Capacitor は、さまざまなアプローチを比較するのに適した場所です。
トークン更新の最小限の形は、以下のようになります。
async function authorizedFetch(request) {
let token = await tokenStore.getAccessToken()
let response = await api(request, token)
if (response.status !== 401) return response
const refreshed = await auth.refresh()
if (!refreshed) {
await auth.signOut()
throw new Error('Session expired')
}
token = await tokenStore.getAccessToken()
return api(request, token)
}
重要なのは、構文ではなく、セッションの動作を各画面が独自に実装しないようにすることです。
Electronパターンには特別な注意が必要です。
Electronには厳格な境界が必要です。トークン交換と安全なストレージは、可能な限りメインプロセスで行い、レンダラーにRAWトークンを渡さず、レンダラーが適切に動作することを期待するのではなく、狭いIPCメソッドをレンダラーに公開するようにしてください。
デスクトップアプリはモバイルアプリよりもコントロールが可能に感じられることが多いですが、そのような感覚はリスクではなく、保証ではありません。
避けるべき短絡は以下のとおりです。
- レンダラーアクセス可能なローカルストレージにトークンを保存しないでください。 できるだけ避けましょう。
- 各ウィンドウが共有する広範な認証コンテキストを、ウィンドウの目的とセッションの有効期限を確認せずに許可しないでください。 プレロードスクリプトに過度に信頼しないでください。
- セキュリティ上のリスクを軽視しないでください。 プロセス分離と明示的なAPI境界の代替として。
実行の可視性も重要です。Splunkが提供するアプリケーションセキュリティ要件の概要によると、アプリケーション認証は継続的な活動モニタリングとログと統合する必要があります。 、そこでは引用されているベンチマークデータによると、ログと監視する認証イベントを事前に検出すると、15分以内に95%の不正アクセス試行を検出できます。実際には、拒否されたアクション、トークン更新失敗、ロール変更、同意取り消し、不審なリソースアクセスパターンをログに記録する必要があります。 リリースプロセスがハイブリッドアプリ更新を含む場合、このエコシステムでは、__CAPGO_KEEP_0__が提供される。__CAPGO_KEEP_0__とElectronアプリ用に署名されたライブアップデートを提供します。認証を実装することはありませんが、authロジック、リダイレクトハンドリング、またはセッション__CAPGO_KEEP_1__の急切な修正が必要な場合に、修正を迅速に実装できるようにします。
セキュアなアプリ認証への道 Capgo, which provides signed live updates for Capacitor and Electron apps. That doesn’t implement authorization for you, but it does affect how quickly you can ship fixes when auth logic, redirect handling, or session code needs urgent correction.
アプリケーション認証は、組織のセキュリティとデータ保護に不可欠です。
認証の重要性
CapacitorとElectronチームにとって最も重要なのは、エッジの規律です。ブラウザ時代のショートカットは、ネイティブストレージ、ディープリンク、デスクトッププロセス境界、またはアプリレビュー要件と接触すると存続できません。トラブルを避けるチームは、通常、なんとなく特別なことはしていません。スコープ、セッションハンドリング、サーバーサイドチェック、監査可能性について一貫性を保ちます。
現在の認証設定が絡み合っている場合、それは正常です。最初に、1つの境界を一つずつ整理してみましょう。フローを修正してください。ストレージを修正してください。UIからアクセスルールを外してください。ログを追加してください。誰かが何も持っていないことを要求したときに、誰に何が許可されているかを教えてくれるようにしてください。
セキュアなアプリ認証が管理可能になるのは、そのような方法でしかありません。理論上は簡単ではありません。codeでは、安全です。
Capgoは、CapacitorとElectronアプリの修正をストアレビューの待たずに配信できるようにします。これは、認証フロー、トークンハンドリング、またはセッションのバグを修正する必要があるときに重要です。チームがクロスプラットフォームのリリース、ターゲットロールアウト、ロールバックサポートについてより制御したい場合、Capgoを評価することをお勧めします。 Capgo __CAPGO_KEEP_0__は、Capgoにプルリクエストを提出するときに使用します。