web-dev-qa-db-ja.com

REST Facebookを認証に使用するWebサイトのAPI

ログインしてサイトで自分を認証するonly方法がFacebookを使用するWebサイトがあります(これは私の選択ではありませんでした)。 Facebookで初めてログインすると、アカウントが自動的に作成されます。

ここで、サイト用のiPhoneアプリケーションと、他の人がサービスを使用するためのパブリックAPIを作成します。

この質問は、アプリ/ APIからWebサイトで認証する方法に関するもので、2つの部分に分かれています。

  1. APIからFacebook RESTを認証方法としてのみ使用するWebサイトへの認証OAuth認証を処理する正しい方法は何ですか?

    REST API。認証情報がないため、 Basic Auth over HTTPS のような方法は使用できません。 this のようなものは、APIを使用してアプリケーションを認証するためだけのもののようです。

    現在、私が考えることができる最善の方法は、APIで/ authorizeエンドポイントをヒットし、Facebook OAuthにリダイレクトしてからサイトにリダイレクトし、APIのユーザーが後続の認証に使用できる「トークン」を提供することですリクエスト。

  2. 公式アプリケーションを作成する場合、必ずしも同じ方法でパブリックAPIを使用する必要はありません。私たちのウェブサイトと話し、ユーザーを認証する最良の方法は何でしょうか?

API(パブリック)キーとシークレット(プライベート)キーを使用して、APIを使用しているサードパーティアプリケーションを認証する方法を理解しています。ただし、アプリを使用しているユーザーの認証に関しては、ユーザーを認証する唯一の方法がFacebookである場合、その方法についてかなり混乱しています。

私は非常に明白な何かを見逃しているように感じます、またはpublic REST APIがどのように機能するかを完全に理解していないので、アドバイスやヘルプは大歓迎です。

82
Adam

更新:以下を参照

私もこの質問について一生懸命考えています。私にはまだ完全に明確ではありませんが、ここに行くことを考えているルートがあります。 REST APIおよびユーザーのみ Facebook接続による認証を作成しています。

クライアントで:

  1. Facebook APIを使用してログインし、OAUTH2コードを取得します。
  2. このコードをアクセストークンと交換します。
  3. カスタムAPIを呼び出すたびに、FacebookユーザーIDとアクセストークンを含めます。

APIで(ユーザー認証を必要とするすべてのメソッドに対して):

  1. 上記のアクセストークンを使用して、/ me Facebookグラフにリクエストを行います。
  2. 返されたFacebookユーザーIDが、上記からAPIに渡されたユーザーIDと一致することを確認します。
  3. アクセストークンの有効期限が切れている場合は、追加の通信が必要です。

これをまだテストしていません。どのように聞こえますか?

---更新:質問に答えるために2014年7月27日---

上記の交換はログイン時に1回だけ使用します。ログインしているユーザーを特定したら、独自のアクセストークンを作成し、そのトークンはその時点から使用されます。新しいフローは次のようになります...

クライアントで:

  1. Facebook APIを使用してログインし、OAUTH2コードを取得します。
  2. このコードをアクセストークンと交換します。
  3. Facebookトークンをパラメーターとして含む、my APIからアクセストークンを要求する

APIで

  1. アクセストークンリクエストを受信します。
  2. Facebookアクセストークンを使用して/ me Facebookグラフにリクエストを行う
  3. Facebookユーザーが存在し、データベース内のユーザーと一致することを確認します
  4. 独自のアクセストークンを作成して保存し、この時点から使用するクライアントに返す
90
Chris Greenwood

これは、JWT(JSON Web Tokens)を使用した私の実装であり、基本的にChrisの更新された回答に似ています。 Facebook JS SDKとJWTを使用しました。

これが私の実装です。

  1. Client:Facebook JS SDKを使用してログインし、アクセストークンを取得します。

  2. Client:/verify-access-tokenエンドポイントを呼び出して、APIからJWTを要求します。

  3. MyAPI:アクセストークンを受信し、Facebook APIの/meエンドポイントを呼び出して検証します。

  4. MyAPI:アクセストークンが有効な場合、データベースからユーザーを見つけ、存在する場合はログインします。ペイロードとして必須フィールドを持つJWTを作成し、有効期限を設定し、秘密鍵で署名して、クライアントに送り返します。

  5. Client:JWTをローカルストレージに保存します。

  6. Client:次のAPI呼び出しの要求とと​​もにトークン(ステップ5のJWT)を送信します。

  7. MyAPI:トークンを秘密鍵で検証し、トークンが有効な場合、トークンを新しいものと交換し、トークンとともにクライアントに送り返しますAPIレスポンス。 (トークンの検証のための外部API呼び出しはここではありません)[トークンが無効/期限切れの場合、クライアントは再度認証して1から繰り返すように要求します]

  8. Client格納されたトークンを新しいトークンに置き換え、次のAPI呼び出しに使用します。トークンの有効期限が切れると、トークンの有効期限が切れてAPIへのアクセスが取り消されます。

すべてのトークンが1回使用されます。

セキュリティとJWTに関する回答をもっと読む

JWTの安全性

JWTをデコードできる場合、それらはどのように安全ですか?

ユーザーIDおよび認証トークンとしてのJSON Web Tokens(JWT)

14

私は同じ質問に答えようとしていますが、最近多くの本を読んでいます...

「その」答えはありませんが、物事は少し明確になっています。 あなたが言及した記事 のコメントを読みましたか?私はそれらが本当に面白くて役に立つとわかりました。

その結果、そして最初の記事が書かれてから物事がどのように進化したかに照らして、私がやろうと思うことは次のとおりです。

  • どこでもHTTPS —これにより、HMAC、署名、ナンスなどを忘れることができます。

  • OAuth2を使用します。

    • 自分のアプリ/ウェブサイトから認証リクエストが来た場合、前述の 記事への返信 で説明されているこの「トリック」(またはそのバリエーション)を使用します。

    • 私の場合、2種類のユーザーがいます。クラシックログイン/パスワード認証情報を持つユーザーと、Facebook Connectにサインアップしたユーザーです。
      だから、「Login with Facebook」ボタンのある通常のログインフォームを提供します。ユーザーが「クラシック」資格情報でログインする場合、これらのOAuth2エンドポイントにgrant_type=password
      Facebook経由でログインすることを選択した場合、2段階のプロセスになると思います。

      • まず、Facebook iOS SDKを使用してFBSessionを開きます
      • それが完了し、アプリに制御が戻ったら、そのユーザーのFacebook IDを取得する方法が必要です。このIDを単独でOAuth2エンドポイントに送信します。サーバーは「FBユーザーIDを使用している」と理解している extension grant を付けます.

私はまだこれらすべてについて徹底的に研究しているので、それは完璧な答えではないかもしれないことに注意してください...たぶん正しい答えでさえないかもしれません!しかし、それは良い出発点になると思います。 Facebook認証に「拡張許可」を使用するという考えには、適切に処理するためにそれを登録する必要がありますか?私はあまりよく分からない。

とにかく、少しでもお役に立てば幸いであり、少なくともこの問題の最良の解決策を見つけるための議論を始めることができれば幸いです:)

更新
Facebookのログインは、コメントで指摘されているソリューションではありません。誰でも任意のユーザーIDを送信して、このユーザーとしてAPIにログインできます。

このようにするのはどうですか:

  • 「Facebookログイン」ボタンでログインフォームを表示する
  • このログイン方法が選択された場合、Facebook SDKのように動作します。認証サーバーからWebページを開き、Facebookログインを開始します。
  • ユーザーがログインすると、FacebookはリダイレクトURLを使用して確認します。そのURLが認証サーバーの別のエンドポイントを指すようにします(おそらく、アプリからの呼び出しを示す追加のパラメーターを使用しますか?)
  • 認証エンドポイントにヒットすると、Facebook SDKと同様に、認証によりユーザーを安全に識別し、FBユーザーID/FBセッションを保持し、カスタムURLスキームを使用してアプリにアクセストークンを返すことができます

よく見える?

5
Olivier Lance