ログインしてサイトで自分を認証するonly方法がFacebookを使用するWebサイトがあります(これは私の選択ではありませんでした)。 Facebookで初めてログインすると、アカウントが自動的に作成されます。
ここで、サイト用のiPhoneアプリケーションと、他の人がサービスを使用するためのパブリックAPIを作成します。
この質問は、アプリ/ APIからWebサイトで認証する方法に関するもので、2つの部分に分かれています。
APIからFacebook RESTを認証方法としてのみ使用するWebサイトへの認証OAuth認証を処理する正しい方法は何ですか?
REST API。認証情報がないため、 Basic Auth over HTTPS のような方法は使用できません。 this のようなものは、APIを使用してアプリケーションを認証するためだけのもののようです。
現在、私が考えることができる最善の方法は、APIで/ authorizeエンドポイントをヒットし、Facebook OAuthにリダイレクトしてからサイトにリダイレクトし、APIのユーザーが後続の認証に使用できる「トークン」を提供することですリクエスト。
公式アプリケーションを作成する場合、必ずしも同じ方法でパブリックAPIを使用する必要はありません。私たちのウェブサイトと話し、ユーザーを認証する最良の方法は何でしょうか?
API(パブリック)キーとシークレット(プライベート)キーを使用して、APIを使用しているサードパーティアプリケーションを認証する方法を理解しています。ただし、アプリを使用しているユーザーの認証に関しては、ユーザーを認証する唯一の方法がFacebookである場合、その方法についてかなり混乱しています。
私は非常に明白な何かを見逃しているように感じます、またはpublic REST APIがどのように機能するかを完全に理解していないので、アドバイスやヘルプは大歓迎です。
私もこの質問について一生懸命考えています。私にはまだ完全に明確ではありませんが、ここに行くことを考えているルートがあります。 REST APIおよびユーザーのみ Facebook接続による認証を作成しています。
クライアントで:
APIで(ユーザー認証を必要とするすべてのメソッドに対して):
これをまだテストしていません。どのように聞こえますか?
上記の交換はログイン時に1回だけ使用します。ログインしているユーザーを特定したら、独自のアクセストークンを作成し、そのトークンはその時点から使用されます。新しいフローは次のようになります...
クライアントで:
APIで
これは、JWT(JSON Web Tokens)を使用した私の実装であり、基本的にChrisの更新された回答に似ています。 Facebook JS SDKとJWTを使用しました。
これが私の実装です。
Client:Facebook JS SDKを使用してログインし、アクセストークンを取得します。
Client:/verify-access-token
エンドポイントを呼び出して、APIからJWTを要求します。
MyAPI:アクセストークンを受信し、Facebook APIの/me
エンドポイントを呼び出して検証します。
MyAPI:アクセストークンが有効な場合、データベースからユーザーを見つけ、存在する場合はログインします。ペイロードとして必須フィールドを持つJWTを作成し、有効期限を設定し、秘密鍵で署名して、クライアントに送り返します。
Client:JWTをローカルストレージに保存します。
Client:次のAPI呼び出しの要求とともにトークン(ステップ5のJWT)を送信します。
MyAPI:トークンを秘密鍵で検証し、トークンが有効な場合、トークンを新しいものと交換し、トークンとともにクライアントに送り返しますAPIレスポンス。 (トークンの検証のための外部API呼び出しはここではありません)[トークンが無効/期限切れの場合、クライアントは再度認証して1から繰り返すように要求します]
Client格納されたトークンを新しいトークンに置き換え、次のAPI呼び出しに使用します。トークンの有効期限が切れると、トークンの有効期限が切れてAPIへのアクセスが取り消されます。
すべてのトークンが1回使用されます。
セキュリティとJWTに関する回答をもっと読む
私は同じ質問に答えようとしていますが、最近多くの本を読んでいます...
「その」答えはありませんが、物事は少し明確になっています。 あなたが言及した記事 のコメントを読みましたか?私はそれらが本当に面白くて役に立つとわかりました。
その結果、そして最初の記事が書かれてから物事がどのように進化したかに照らして、私がやろうと思うことは次のとおりです。
どこでもHTTPS —これにより、HMAC、署名、ナンスなどを忘れることができます。
OAuth2を使用します。
自分のアプリ/ウェブサイトから認証リクエストが来た場合、前述の 記事への返信 で説明されているこの「トリック」(またはそのバリエーション)を使用します。
私の場合、2種類のユーザーがいます。クラシックログイン/パスワード認証情報を持つユーザーと、Facebook Connectにサインアップしたユーザーです。
だから、「Login with Facebook」ボタンのある通常のログインフォームを提供します。ユーザーが「クラシック」資格情報でログインする場合、これらのOAuth2エンドポイントにgrant_type=password
。
Facebook経由でログインすることを選択した場合、2段階のプロセスになると思います。
私はまだこれらすべてについて徹底的に研究しているので、それは完璧な答えではないかもしれないことに注意してください...たぶん正しい答えでさえないかもしれません!しかし、それは良い出発点になると思います。 Facebook認証に「拡張許可」を使用するという考えには、適切に処理するためにそれを登録する必要がありますか?私はあまりよく分からない。
とにかく、少しでもお役に立てば幸いであり、少なくともこの問題の最良の解決策を見つけるための議論を始めることができれば幸いです:)
更新
Facebookのログインは、コメントで指摘されているソリューションではありません。誰でも任意のユーザーIDを送信して、このユーザーとしてAPIにログインできます。
このようにするのはどうですか:
よく見える?