2013-05-31 5 views
2

Я использую драгоценный камень OAuth2 для связи с службами Google. Я не понимаю, как реализовать обратный вызов, который получает ответ с кодом OAuth, чтобы получить токен доступа. Когда я устанавливаю точку останова в методе callback, он никогда не вызывает вызов.Как настроить маршрут для обратного вызова oauth

Вот мой код:

Маршруты:

match '/oauth2/callback' => 'reports#callback' 

Actual перенаправлением URL:

http://localhost/oauth2/callback?code=111111 

ReportsController:

def new 
client = OAuth2::Client.new(ENV['GA_CLIENT_ID'], ENV['GA_SECRET_KEY'], { 
     :authorize_url => 'https://accounts.google.com/o/oauth2/auth', 
     :token_url => 'https://accounts.google.com/o/oauth2/token' 
    }) 
redirect_to client.auth_code.authorize_url({ 
     :scope => 'https://www.googleapis.com/auth/analytics.readonly', 
     :redirect_uri => 'http://localhost/oauth2/callback', 
     :access_type => 'offline' 
    }) 
end 

def callback 
    oauth_code = params[:code] 

    # Create access token with oauth_code 
end 

ответ

4

сервер Google пытается открыть URL http://localhost/oauth2/callback?code=111111, что недопустимо.

Для использования службы, такой как OAuth, требуется доменное имя, поскольку сервер google должен иметь возможность находить ваш компьютер через Интернет.

Чтобы быть в состоянии сделать это с вашей машине вы должны:

  1. Установить имя на известном DNS-сервере: Самый простой способ сделать это через динамический сервер DNS, как dyndns или no-ip

  2. Если вы находитесь за маршрутизатором с помощью NAT, что вам может понадобиться, чтобы перенаправить запросы на ваш модем на порт 80 к компьютеру: Если вы не сделаете этого, ваш модем будет получите пакет на порту 80 из Google и скажут «не для меня», отбросив его. Вы можете сделать это в своем модемом - искать переадресацию порта или раздел NAT на нем.

+0

Это имеет смысл, но когда я изменяю свой URL-адрес перенаправления на 'http: // SITE_NAME/oauth2/callback' и тестирую в моем проекте env, обратный вызов никогда не запускается. Я обязательно использовал свой продукт client_id и секрет из консоли google api, а также сопоставил URL-адрес перенаправления. Я даже добавляю 'assert_prompt => 'force'' – mnort9

+0

@ mnort9 и все же ничего не имею в вашем журнале производства, например, что-то, что нельзя было проложить? Возможны две вещи: 1) Google не отправляет вам никаких запросов или 2) отправляет неверный запрос и получает ошибку маршрутизации. Я предлагаю также попытаться загрузить консоль на производство и попробовать вызовы OAuth вручную, чтобы увидеть, можете ли вы найти что-то не так. – fotanus

+0

Хорошо, я получил эту работу в производстве. Я проверю ваш метод локально, как только смогу. – mnort9

1

Redirect_url, переданный google, должен точно соответствовать URL-адресу обратного вызова, как видно из браузера клиента. Нет проблем с использованием localhost в URL-адресе (предложение fotanus о DNS и NAT неверно). Если вы используете свой контейнер в другой порт (например, 8080), вы должны:

  • Укажите URL в Google Cloud: http://localhost:8080/oauth2/callback

  • Укажите тот же обратный адрес в запросе клиента.

Смежные вопросы