web-dev-qa-db-ja.com

単一ページのJavaScriptアプリケーションに対してクライアント側の認証を行う最良の方法は?

確かなバックエンドのアクセス許可を既に持っています(つまり、管理者はアクションを実行できますが、通常のユーザーはアクションを実行できません)。ただし、単一ページのJavaScriptアプリケーションに対してフロントエンド認証を実行し、APIからビューごとに権限を取得するより良い方法があるかどうか疑問に思っています。

私ができるようです:

a。それがどのようなユーザーであるかを伝えるグローバルな方法がありますか?

  • 私はこれを行うことができますが、バックエンドで権限が変更された場合、フロントエンドで何を表示できるかを更新する必要があります。

b。すべてのビューの権限を確認しますか?

  • 多くのAPIリクエストのようです

c。ダッシュボード用に別のアプリを作成しますか?

  • そうすれば、通常のユーザーがそこに戻って周りを見回すことなく、ユーザーの現在の権限をすべて知ることができます。

私はcで私の質問に答えたかもしれませんが、誰かがより良いアイデアを考えたら、それを聞きたいです。

7

それはあなたが「許可」によって何を意味するかによる。ユーザーリソースとプロジェクトリソースの例を使用していくつかのアイデアを紹介します。

権限が特定のプロジェクトから独立している場合は、実際にはユーザーに役割(管理者など)があることを意味しています。これは、そのユーザーのAPI表現でエンコードできます。

権限が基礎となるリソースに依存している場合(たとえば、ユーザーは特定のプロジェクトに対して異なる権限を持つことができる)、これらはそのリソースのAPI表現に常駐できます。これには、ユーザーのすべての権限の巨大な辞書が必要ないという長所と、そのリソースのキャッシュがユーザー固有である必要があるという短所があります。これは許容できるトレードオフです。

誰かがアクションを試みる前にビューをロードし、ビューされたリソースに対する権限を変更した場合、古いデータの潜在的なユーザビリティの問題が依然としてあります。これを軽減する1つの方法は、表示されたリソースに更新をプッシュするためにwebsocketを使用して、UIがバックエンドデータベースで古くなるウィンドウを削減することです。

4
sapientpants

1つのアプローチは、すべてのユーザーのアクセス許可をローカルストレージに保存し、その周りにラッパーを作成し、ユーザーが実行できることをベースにして表示/非表示にすることです。

2
user303848

それには多くのオプションがあります。私は以下で構成されるアプローチを使用しました:

  • APIを呼び出して、ページが初めて読み込まれたときに認証リストを取得します。結果をキャッシュします。
  • タイムスタンプのみを返すユーザー許可の最終更新をクエリするビュー呼び出しAPIにルーティングする前。
  • 変更がある場合は、APIを呼び出して、最後の変更のタイムスタンプの後に承認を更新します。
2

1つの解決策は、サーバー側で認証トークン(非対称暗号の場合と同様)を生成することです。認証トークンは署名されているため、攻撃者が秘密鍵を知らないため、改ざんできません。

つまり、トークンは次のようになります。

id: userId
type: type of user
privileges: {
    privilege1,
    privilege2
}
expiry: some time in the near future, after which your app should request a new token

次に、秘密鍵を使用してサーバーでこれに署名します。自由に配布された公開鍵により、誰でもサーバーがトークンを発行したサーバーであることを確認できるため、JavaScriptアプリはトークンを安全に使用して、ユーザーがアクセスできるものを決定できます。

0
Maybe_Factor