2012-06-22 4 views
1

Ниже приведен код, который я использую, чтобы разрешить пользователям разрешать моим приложениям доступ к их Календарю Google через OAuth. Я основал его this sample code.Ошибка «Отсутствует код авторизации» при использовании Google Calendar API

Он работает большую часть времени, но иногда есть ArgumentError: Missing authorization code ошибка на client.authorization.fetch_access_token! линии в create_google_calendar действия в контроллере services. Если я прокомментирую эту строку, все атрибуты client.authorization: null.

Я использую Rails 3.2.0 и Ruby 1.9.2.

Что вызывает это?

Gemfile

gem 'google-api-client', :require => 'google/api_client' 

service.rb

def self.google_calendar_client google_calendar_service=nil 
    client = Google::APIClient.new 
    client.authorization.client_id = xxx 
    client.authorization.client_secret = xxx 
    client.authorization.scope = 'https://www.googleapis.com/auth/calendar' 
    url_prefix = Rails.env.production? ? xxx : 'http://localhost:3000' 
    client.authorization.redirect_uri = "#{url_prefix}/create_google_calendar" 
    if google_calendar_service.present? 
     client.authorization.update_token! :access_token => google_calendar_service.token, :refresh_token => google_calendar_service.google_calendar_refresh_token, :expires_in => google_calendar_service.google_calendar_expires_in, :issued_at => Time.at(google_calendar_service.google_calendar_issued_at) 
     client.authorization.fetch_access_token! if client.authorization.expired? 
    end 

    client 
end 

services_controller.rb

def connect_google_calendar 
    @google_calendar_url = Service.google_calendar_client.authorization.authorization_uri.to_s 
end 

def create_google_calendar 
    client = Service.google_calendar_client 
    client.authorization.code = params[:code] 
    client.authorization.fetch_access_token! 
    current_user.services.create :provider => 'google_calendar', :token => client.authorization.access_token, :google_calendar_refresh_token => client.authorization.refresh_token, :google_calendar_expires_in => client.authorization.expires_in, :google_calendar_issued_at => client.authorization.issued_at 
end 

ответ

1

Правда, я не знаю. Ваш код выглядит правильно. Но я могу хотя бы сказать вам, что означает ошибка. Отсутствующий код авторизации означает, что он думает, что вы пытаетесь выполнить тип гранта «авторизационный код» при получении маркера доступа. Если вы на самом деле пытаетесь получить токен доступа с токена обновления, а не делать это на первом проходе после получения авторизации от пользователя, возможно, вы неправильно настроили объект авторизации.

Вы можете проверить это, проверив значение client.authorization.grant_type. В самых последних версиях клиента вы можете вручную установить значение grant_type для принудительного использования определенного режима, что может дать вам более информативные сообщения об ошибках в зависимости от фактической проблемы.

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