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 предоставляется вместо передачи пользователя непосредственно на страницу авторизации).