私はこのトピックについてたくさん読んでいますが、私が見つけたのは時代遅れまたは部分的な答えだけであり、それは私をそれほど助けず、実際には私をもっと混乱させます。Webアプリ(APIと同じドメインでホストされている)とAndroidアプリからアクセスできるRest API(Node + Express + MongoDB)を作成しています。
アプリケーションと許可されたユーザーだけがAPIにアクセスできるようにしたい。また、ユーザーが自分のFacebookアカウントのみを使用してサインアップおよびログインできるようにし、名前、プロフィール写真、電子メールなどの基本情報にアクセスできるようにする必要があります。
私が考えている考えられるシナリオは次のとおりです。
- ユーザーがFacebookを使用してWebアプリにログインすると、アプリはユーザーのFacebook情報にアクセスするためのアクセス許可を付与され、アクセストークンを受け取ります。
- WebアプリはAPIに、このユーザーが実際にシステムに登録されていることを確認するように要求し、Facebookが受信した電子メールとトークンを送信します。
- APIは、ユーザーが存在することを確認し、ユーザー名、トークン、タイムスタンプをDB(またはRedis)に保存してから、クライアントアプリに戻ります。
- クライアントアプリがAPIエンドポイントの1つに到達するたびに、他の情報以外のユーザー名とトークンを提供する必要があります。
- APIは毎回、提供されたペアのユーザー名/トークンがDBに保存された最新のペアのユーザー名/トークンと一致し(注文するタイムスタンプを使用)、これらの情報を保存してから1時間以内に経過したことを確認します(ここでもタイムスタンプ)。その場合、APIはリクエストを処理します。それ以外の場合は、401Unauthorizedレスポンスを発行します。
これは意味がありますか?このアプローチには、私が見逃している巨視的なセキュリティホールがありますか?MongoDBを使用してこれらの情報を保存する際に見られる問題の1つは、コレクションが古いトークンですぐに肥大化することです。この意味で、古い情報がRedisによって自動的に削除されるように、1時間の有効期限ポリシーでRedisを使用するのが最善だと思います。