0

Facebook のログイン ビューでは、ユーザーはアクセス許可を拒否できます。拒否されたアクセス許可がアプリの機能に影響を与えている可能性があります (一部のデータにアクセスできないため、このアプリでできることは少なくなります)

ユーザーに警告し、再度許可を求めたいと思います。しかし、Omniauth-Facebookの方法がわかりません。Facebook のドキュメントでは、これを実現する方法として、次のパラメーターをリクエスト ログインに追加する方法が示されています。auth_type=rerequest

https://www.facebook.com/dialog/oauth?
    client_id={app-id}&
    redirect_uri={redirect-uri}&
    auth_type=rerequest&
    scope=email

Omniauth でこれを直接行う方法は見たことがありません。自分でアクセス許可を確認した後、「auth/facebook/callback」からこの URL を呼び出そうとしましたが、ユーザーが新しいアクセス許可を再承認すると、次のエラーが発生します。ログインする:

 ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
OmniAuth::Strategies::OAuth2::CallbackError: csrf_detected | CSRF detected
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-1.2.2/lib/omniauth/failure_endpoint.rb:25:in `raise_out!'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-1.2.2/lib/omniauth/failure_endpoint.rb:20:in `call'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-1.2.2/lib/omniauth/failure_endpoint.rb:12:in `call'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:475:in `fail!'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-oauth2-1.2.0/lib/omniauth/strategies/oauth2.rb:73:in `callback_phase'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-facebook-1.6.0/lib/omniauth/strategies/facebook.rb:71:in `callback_phase'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:227:in `callback_call'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:184:in `call!'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:164:in `call'
    /home/ciro/.rvm/gems/ruby-2.1.3/gems/omniauth-1.2.2/lib/omniauth/builder.rb:59:in `call'

これは私の「auth/facebook/callback」です

on get do
  on 'auth/facebook/callback' do
    on param(:code) do |code| 
      email = req.env['omniauth.auth']['info']['email'] 

      if email.nil? or email.empty?
        res.redirect "https://www.facebook.com/dialog/oauth?client_id=#{ENV['APP_ID']}&redirect_uri=http://localhost:9292/auth/facebook/callback&auth_type=rerequest&scope=email"
      end
    end
  end
end
4

1 に答える 1

1

解決策は、OmniAuth リクエストでパラメーターを渡すことです。

if email.nil? or email.empty?
    res.redirect "/auth/facebook?scope=email"
end
于 2015-01-15T18:57:44.027 に答える