Facebook и RoR: как перенаправить на авторизацию URL?

Я пытаюсь перенаправить пользователя на URL, который запрашивает разрешение на доступ к информации пользователя.

У меня есть представление с формой, действие которой заключается в следующем:

class AuthController < ApplicationController

   def auth
     @oauth = Koala::Facebook::OAuth.new("*id*", "*secret*", 'http://localhost:3000/auth/auth2') 
     address = @oauth.url_for_oauth_code(:permissions => "publish_stream")
     puts "address  #{address}"
     redirect_to address
     return  
   end

   def auth2

   end

end

На stdoutадрес отображается как: Redirected to https://graph.facebook.com/oauth/authorize?client_id=*id*&redirect_uri=http://localhost:3000/auth/auth2&scope=publish_stream

Если я введу этот URL-адрес автономно в своем браузере (а не через свое приложение), я попаду на правильную страницу, где приложение запрашивает разрешения. Однако, благодаря моему приложению, я попадаю на страницу с логотипом Facebook, а не на страницу, запрашивающую разрешения.

Я ожидал увидеть страницу с разрешениями, а затем, как только пользователь разрешил разрешение, запрос перенаправился на мой redirect_uri.

3 ответа

Недавно я столкнулся с подобной проблемой. Чтобы вырвать ваше приложение из iframe и перенаправить на страницу авторизации со стороны сервера перенаправления в rails, вы можете сделать это:

def facebook_authorization
  redirect_url =<<-EOS
    <script>
      top.location.href='https://graph.facebook.com/oauth/authorize?client_id=client_id&redirect_uri=http://localhost:3000/xxx&scope=publish_stream';
    </script>
   EOS       

   render :inline => redirect_url
end

Это почти так же, как описано в документации на Facebook с использованием php.

Далее, если пользователь авторизует ваше приложение, вы получите токен oauth_access в параметре ответа signature_request. Я не использую Коалу, поэтому не уверен, как они разбирают подписанный запрос.

В результате тестирования я обнаружил, что, пока пользователь авторизует ваше приложение, вы будете получать токен oauth_access от Facebook при каждом запросе. Это позволяет легко определить, авторизовал ли пользователь приложение или нет, и вы избегаете отправлять пользователю страницу авторизации каждый раз, когда он / она посещает ваше приложение.

Вы используете fbml для перенаправления или пытаетесь сделать это на стороне сервера? Если ваше приложение представляет собой страницу холста и вы перенаправляете серверную часть, вы перенаправляете только Facebook, а не пользователя. Вам нужно будет убедиться, что вы на самом деле говорите Facebook, чтобы сделать перенаправление.

Проверьте fb:redirect, если это так.

Я просто хотел опубликовать ответ на мой вопрос. Решение было на самом деле довольно простым. Вместо перенаправления на URI авторизации в моем контроллере, мне нужно было сделать это, по моему мнению, следующим образом. Это позволило избежать промежуточной страницы входа в систему и, по-видимому, является тем, что делают все остальные, кто столкнулся с этой конкретной проблемой (где промежуточная страница facebook предоставляется вместо передачи пользователя непосредственно на страницу авторизации).