Вопрос

The following is the code I am using to allow users to allow users to authorise my app to access their Google Calendar via OAuth. I based it off this sample code.

It works most of the time, but sometimes, there is an ArgumentError: Missing authorization code error on the client.authorization.fetch_access_token! line in the create_google_calendar action in the services controller. If I comment out that line, all of the client.authorization attributes are null.

I am using Rails 3.2.0 and Ruby 1.9.2.

What is causing this?

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
Это было полезно?

Решение

The truth is, I don't know. Your code looks right to me. But I can at least tell you what the error means. Missing authorization code means that it thinks you're trying to do an "authorization code" grant type when you fetch the access token. If you're actually trying to obtain an access token off a refresh token as opposed to doing it on the first pass after obtaining authorization from the user, then you may not have correctly set up the authorization object.

You can check this by inspecting the client.authorization.grant_type value. In very recent versions of the client you can manually set the grant_type value to force a particular mode, which may give you more informative error messages, depending on what the actual issue is.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top