1

私は omniauth を使用して、ユーザーが Ruby on Rails アプリケーションで Facebook および Twitter アカウントでサインインできるようにしています。Twitterrequest.env["omniauth.auth"]はアカウントの電子メールを提供しないので、私はそれを作成します (電子メールはデータベースで NULL にすることはできません)。私はこのコードを持っています:

if params[:provider] == 'facebook'
              email = omniauth[:info]["email"]
elsif params[:provider] == 'twitter'
              email = omniauth[:info]["name"] + '@example.com'
end
user = User.new(:email => email)

Facebookアカウントでサインインすると、完璧に機能します。しかし、Twitter アカウントで試してみると、アプリケーションで次のエラーが表示されます。

SQLite3::ConstraintException: users.email may not be NULL [SQL query]

メールの構成が悪いのか、何かの理由でメールが NULL かどうかを数回確認しましたが、NULL ではありませんでした。omniauth-twitterそしてomniauth-facebookgemがインストールされます。誰かが理由を知っていますか?さらにコードや情報が必要な場合はお知らせください。

4

2 に答える 2

0

Twitterは、OAuthハンドシェイクの一部として電子メールアドレスを送り返しません。1つを生成するか、別の登録ページに送信して、登録フィールドに事前入力するためにTwitter認証情報を一時的に保存する必要があります。

ユーザーの名前に基づいて電子メールアドレスを生成しようとしているようです。Twitterはこれを「FirstNameLastName」の形式で送り返すため、電子メールアドレスの検証がある場合、「FirstNameLastName@someaddress.com」の形式の電子メールアドレスは受け入れられません。"#{omniauth[:info][:nickname]}@twitter.com"代わりに使用することをお勧めしますか?このように、Twitterのユーザー名は一意であるため、重複する電子メールアドレスからも保護されます。

于 2012-12-14T09:22:24.380 に答える
0

私はこれらのアプローチのどれも正直に言うのが好きではありません。名前は一意の制約ではなく、Twitterユーザーはいつでもニックネームを変更できます。ユーザーがニックネームを変更するとどうなりますか?彼は自分のアカウントにアクセスできなくなりますか?そして、別の人が自分のニックネームを現在利用可能なニックネームに変更した場合はどうなりますか?彼は他のユーザーのアカウントにアクセスできますか?

2つのより良い解決策は次のいずれかです。

  1. Ryan Batesのアプローチに従い、ユーザーをメールを入力できるフォームにリダイレクトします。または

  2. Deviseのメソッドemail_requiredをオーバーライドしますか?。何かのようなもの:

    # user.rb
    def email_required?
      authentications.empty?
    end
    

    このようにして、ログインプロセスに余分な手順を導入する必要はありません。

于 2012-12-14T13:45:49.563 に答える