Почему я получаю сообщение об ошибке 404 при попытке получить access_token из Google OAuth 2.0? - PullRequest
0 голосов
/ 09 февраля 2012

В настоящее время я создаю авторизацию OAuth, чтобы получать только электронную почту и информацию о профиле.

Я могу легко получить код, используя следующее:

def authorize
  base = "https://accounts.google.com/o/oauth2/auth?"
  params = {
    :scope => "https://www.googleapis.com/auth/userinfo.profile",
    :redirect_uri => "http://localhost:3000/oauth/callback/",
    :client_id => "id",
    :response_type => 'code'
  }
  redirect_to base + params.to_query
end

Однако, когда я пытаюсь получить токен доступа от Google, я получаю ошибку 404:

def callback
  code = params[:code]
  client_id = 'id'
  client_secret = 'secret'
  redirect_uri = "http://localhost:3000/oauth/callback/"
  http = Net::HTTP.new('accounts.google.com', 80)
  path = "https://accounts.google.com/o/oauth2/token?"
  headers = {'Content-Type'=>"application/x-www-form-urlencoded" }
  parameters = "code=#{code}&grant_type=authorization_code&client_secret=#{client_secret}&client_id=#{client_id}&redirect_uri=#{redirect_uri}"
  resp, data = http.post(path,parameters,headers)
end

response code: 404  data: Google Home | Sign in

The page you requested is invalid.

Я не совсем уверен, в чем может быть проблема.Я пытался сопоставить с копировать + вставить зарегистрированный URL обратного вызова.Я несколько раз проверил свои параметры и не могу найти причину ошибки.

Я следую документации Google и зарегистрировался в Google со следующей информацией:

Client ID for web applications 
Client ID: id
Client secret: secret
Redirect URIs: http://localhost:3000/oauth/callback/ 
JavaScript origins: none

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Работает!

Похоже, я пропустил пару вещей:

  1. Добавлены настройки SSL для HTTP-запроса.
  2. Отправьте параметрыкак тело, а не как часть запроса.
  3. Правильно укажите тип запроса в запросе.

Надеюсь, это кому-нибудь поможет!

param = {
  :code => params[:code],
  :client_id => client_id,
  :client_secret => client_secret,
  :redirect_uri => "http://localhost:3000/oauth/callback/",
  :grant_type => 'authorization_code'
}

uri = URI.parse("https://accounts.google.com/o/oauth2/token")
http = Net::HTTP.new(uri.host, uri.port)
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request["Content-Type"] = "application/x-www-form-urlencoded"
request.body = param.to_query
response = http.request(request)
1 голос
/ 10 февраля 2012

Если вы пытаетесь заставить Google перенаправить на:

:redirect_uri => "http://localhost:3000/oauth/callback/",

Я подозреваю, что они не могут найти localhost.Дайте им ваш реальный номер IP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...