Angular.js (Flask バックエンド Web アプリを使用) で OpenID ベースの認証を実装するにはどうすればよいですか?
Angular.js コードには、ここにある例のようなロジックを組み込む必要があるようです。
ただし、Flask 側にも OpenID 検証メカニズムが必要です。
バックエンドとフロントエンドの両方のロジックを記述する「推奨される」方法はありますか?
初心者向けの github の例やその他の関連リソースはありますか?
残念ながら、共有できるサンプル アプリケーションはありませんが、役に立つと思われる概要レベルの説明を次に示します。
AngularJS アプリがあることを少し忘れて、OpenID 認証交換がどのように機能するかを確認しましょう。
それでは、AngularJS をミックスに追加するとどうなるか見てみましょう。これを行うには多くの方法があることに注意してください。以下で説明するのは 1 つの可能性です。
Angular アプリが認証を必要とするサーバーにリクエストを発行した場合、サーバーはエラー コード 401 を返す必要があります。Angular アプリは、たとえば 401 を取得すると、ログイン フォームをポップアップできます。
しかし、ブラウザーのリダイレクトが必要なため、リッチ JS アプリケーションのコンテキストで OpenID 認証ダンスをすべて実行できるわけではありません。サーバー側アプリケーションは、少なくとも 3 つのルートをサポートする必要があります。
したがって、ユーザーはルート URL に接続し、認証されていない状態で開始される AngularJS アプリを取得します。ある時点で、Angular アプリは、OpenID テキスト フィールドと送信ボタンを含むフォームを使用して、ユーザーにログインを求めるプロンプトを表示します。これらのフォーム フィールドは、コントローラーにアタッチされたクライアント側の Angular 要素ではなく、サーバーに投稿する通常の HTML フォームの一部である必要があります。フォームの「アクション」属性は、サーバーの OpenID ログイン ルートを指している必要があります。
ユーザーがログイン ボタンをクリックすると、サーバーが起動し、OpenID 認証を開始する要求を受け取ります。この時点で、上記の手順 1 ~ 5 は変更なしで実行されます。
ステップ 5 の最後で、サーバーはアプリケーションのデータベースでユーザーを見つけました。サーバーが現在できることは、ルート URL へのリダイレクトで応答して、Angular アプリを再起動することです。アプリを初期状態ではない状態で再起動する必要がある場合は、OpenID 認証プロセスを開始する前に、復元する状態をクライアント側のストレージ (Cookie など) に保存できます。
しかし、これだけでは不十分です。サーバーは、ログインしたユーザーに関する情報を Angular に渡す必要もあります。これを行う 1 つの方法は、リダイレクト URL のクエリ文字列にユーザーの一意の ID またはトークンを添付することです。これは、Angular アプリで実行できます。アクセス。これは、上記のステップ 6 で Cookie に入った ID と同じものになります。
これで Angular アプリが再起動され、必要に応じてその状態を復元でき、ログインしているユーザーを識別する ID またはトークンを取得できます。アプリがサーバーに Ajax 要求を行う必要がある場合、要求と共にこの ID またはトークンを送信します。サーバーはそれを検証し、無効であることが判明した場合、または有効期限があり期限切れであることが判明した場合は 401 を返すことができます。
リクエストで送信された ID が検証されると、リクエストを実行でき、レスポンスを Angular アプリに送り返すことができます。
ログアウト機能は、ユーザー ID/トークンを削除するだけでクライアント側に実装できるため、サーバーへの今後の要求は再度認証なしで送信されます。
非常に重要: ユーザー情報を含む Angular アプリと Flask サーバー間のすべての交換は、安全な HTTP 経由で行う必要があります。そうでない場合、ID またはトークンはプレーン テキストで送信されます。