2011-08-15 14 views
6

私は他のプロジェクトのための標準認証宝石としてDeviseを使用しました。別のプロジェクトでは、私はDevise + OmniauthをTwitter認証に使用しました。Devise + Omniauthにはいくつかの種類のログインがありますか?

新しいプロジェクトでは、エンドユーザーがTwitterやFacebook経由でログインしたり、アプリケーションから登録できるようにする必要があります。将来、ユーザーは自分のアカウントをリンクすることができます。たとえば、彼のTwitterとFacebookアカウント。または、彼のTwitterと "ネイティブ"アカウント。 「ネイティブ」は、彼がウェブアプリに直接登録したアカウントです。

Deviseはそのようなことができますか?もしそうなら、私たちはどのようにユーザーのアカウントを結びつけるのですか?これの背後にあるコンセプトは何ですか?どのFacebookやTwitterアカウントがどのユーザーに属しているかをアプリはどのように知っていますか?

アイデアと提案を歓迎します。

EDIT:

私はhttp://railscasts.com/episodes/236-omniauth-part-2?autoplay=trueを追ってきたと私は何を得るいけないです。

  1. ユーザーがアプリの外に署名されている場合、
  2. ユーザは、異なるサービスプロバイダ(FacebookやTwitter、 など)としてアプリに登録されたアカウント、
  3. ユーザがサインを持っています。

新しいサービスプロバイダと既存のアカウントをリンクする方法をアプリがどのように認識していますか?

Stackoverflow.comがこの機能を持っています。しかし、彼らが "マルチサイン"機能に含まれていないサービスプロバイダーの1つはTwitterです。 TwitterはユーザーのメールをAPIで公開していないため、私はそれを推測している。一方、他のサービスプロバイダ(Facebook、Yahoo、Gmail)はそうしている。

答えて

3

電子メールは一般にすべてのアカウントをリンクするために使用されますが、Twitterでは電子メールアカウントを取得できません。 電子メールを使用することは、実際には、ユーザーが必ずしも同じ電子メールアドレスを持つ各サービスに登録する必要はないので、実際には良い方法ではありません。

ログインした後にfacebook/twitter/google/openidを認証に使用する場合は、ユーザーに質問するのが最も簡単な方法で、ユーザーの予測がより簡単です。 「このウェブサイトはどのように私のFacebookのアカウントを知っていますか?彼らは私を追跡していますか?

面白いのは、新しい認証方法を追加するのではなく、例としてユーザーがFacebookアカウントを1つ作成した場合と、Twitterアカウントを作成した場合にアカウントをマージすることです。

+0

良い説明。これがスタックオーバーフローがTwitter認証を有効にしない主な理由ですか? –

+0

それはおそらく理由です。管理者に直接質問してください。政治的理由もあるかもしれません。 –

+1

StackoverflowはOAuth 1.0を使用しているためTwitterをサポートしていません。私はブログで、現在のシステムに統合するのが苦痛だと読んでいます。ユーザーをサインインさせてから、ユーザー名に対して別のアカウントを追加するのが最善の方法です。それがSOのことです。 http://meta.stackexchange.com/questions/74551/enable-authentication-via-twitter-oauth – Ash

1

それはあなたを助ける、このスクリーンキャストを探してください:あなたが今持っているようOmniAuth

OmniAuth part2

最近I'heは、このような問題に果たしました。私の目標は、Google、Twitter、Facebookなどの多くの認証ソリューションを同時に実装することでした。ユーザーは複数のプロバイダ(Stackoverflow.comなど)でログインできるようになりました。ログアウト後、別のサービスでログインしていました。私は次のスキーマを作成することでこれを実現している(今は何も私のコードを持っていないが、それはあなたの手掛かりを与える必要があります):

class User 
has_many :authentications 
has_many :known_authentications 
end 

class Authentication 
    #implemented nearly as in Ryan's Railscasts (It keeps authorization info) 
end 

class KnownAuthentications 
    #has :provider, :user_id, :uid and :email columns. Here I keep all authorizations for registered user, that he ever had(so I can verify user by email and guess that this is the same user as logged in from different services). I fill this table when user registers with any service(Google, Twitter etc.). 
end 

Iにおけるユーザーloggesは電子メールで、現在の認可サービスのためKnownAuthentificationsテーブルをチェックする(OpenIDのサービスをOAuth - そうしないでください(ここで私は偽のメールを作成します、と言うと[email protected] - > Deviseはexceptinを通らない))。 GoogleからログインしたユーザーがTwitterから現在ログインしているユーザーと同じものになったことを知ってください。

+0

上記の私の編集を参照してください –

+0

私の更新された投稿をチェックしてください、これはあなたにこの問題を解決するための手がかりを与えることを願っています。たぶん私のソリューションはかなりよくはないが、それは私のために働く(Stackoverflow.com :)のように) – bor1s

1

工夫は、その完全に可能であるが、すべてのプロバイダが独自のトークンを持っているので、あなたは関係なく、彼がでログオンすることを選択したプロバイダとユーザーを認識しないための方法が必要です 。

それを行うための最も一般的な方法を電子メールフィールドを使用している場合は、各プロバイダのリクエストに という電子メールを要求する必要があります。私は個人的には好きではありません。

これを解決するには、「Facebookのログイン情報を自分のTwitterログイン情報に接続する」オプションを指定できます。

+0

上記の編集を参照 –

0

私はこの同じ質問をしていますが、これは完全な解決策ではありませんが(私は本当に100%確実ではないと思いますが)これは今構築しているものです。

例:認証用のユーザー名/パスワード、Facebook、およびTwitterを持つサイト。

ユーザがサイトに来て登録したいとします。彼らは認証のためにTwitterを使って登録します。 Twitterは電子メールアドレス以外の情報を渡します。私は、比較のために役立つだろうと思うプロファイル情報(場所、名前など)を保存しています。プロファイル情報を確認するために、認証直後にプロファイルページが表示されます(保存したくない情報は削除できます)。また、追加の認証方法(この場合はユーザー名/パスワードとFacebook)を追加する機会もあります。より重複してアカウントにログインしている間に追加の認証方法をリンクするように促すほど、しかしそれはまだ端の場合として存在する。

エッジケースのシナリオは次のようになります。ユーザーがTwitterにサインアップした後、すぐにログアウトしてFacebookを使用してサインインしようとします。サインインメソッドは、これが新しい認証であることを検出し、Facebookからのoauthデータを既存のプロファイル情報と比較し、一致するものを見つけようとします。次に、上位10個の一致を表示し、ユーザーに既に存在するかどうかを確認してアカウントをリンクできるようにするように頼みます。ユーザーにTwitterを使用してサインインしてから、Facebookアカウントをリンクさせます。

明らかに、誰もが同じ電子メールアドレスを使用していて、Twitterが実際に電子メールアドレスを返すならば、これは簡単で簡単になります。しかし、誰もがそうしているわけではありませんので、あなたができる最善の方法でこの問題を処理しなければなりません。この時点で、私はマッチングオプションを試し、ユーザがサインインしてプロフィール情報を記入する際に他のサービスで認証するようにプッシュします。

関連する問題