質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

2362閲覧

Signet::AuthorizationErrorに困っています(google)

yamady

総合スコア176

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2018/10/11 07:29

何度も申し訳ありません。

Google APIを使って、アプリ内でGoogke認証しているユーザーの
カレンダーにイベントを追加しようと考えているのですが、トークン切れの際に
トークンを再取得できなくて困っています。

開発環境:
Rails(APIモード) 5.2
Ruby 2.5.0

google-api-client require: ['google/apis/calendar_v3', 'google/api_client/client_secrets.rb']
signet require: 'signet/oauth_2/client'

参考URL:
https://qiita.com/yosidadada/items/083a05c8e4465baee98e
こちらのコードをクローンした時は普通に実行できます。

▼ エラー内容

Signet::AuthorizationError: Authorization failed. Server message: { "error": "invalid_grant", "error_description": "Bad Request" }

▼ ソースコード

services/sync_calendar_service.rb

Ruby

1class SyncCalendarService 2 3 attr_accessor :appointment, :user 4 5 CLIENT_OPTIONS = { 6 client_id: ENV['GOOGLE_ID'], 7 client_secret: ENV['GOOGLE_SECRET'], 8 authorization_uri: 'https://accounts.google.com/o/oauth2/auth', 9 token_credential_uri: 'https://www.googleapis.com/oauth2/v4/token', 10 scope: Google::Apis::CalendarV3::AUTH_CALENDAR, 11 redirect_uri: 'http://localhost:3000', 12 additional_parameters: {prompt:'consent'}, 13 } 14 15 def initialize(task,user) 16 @task = task 17 @user = task.user 18 end 19 20 def create_event 21 client = Signet::OAuth2::Client.new(CLIENT_OPTIONS) 22 client.update!(user.google_api_token) 23 service = Google::Apis::CalendarV3::CalendarService.new 24 service.authorization = client 25 service.insert_event(user.calendar_id, calendar_event) 26 rescue Google::Apis::AuthorizationError 27 # これが実行できない 28 response = client.refresh! 29 user.google_api_token = user.google_api_token.merge(response) 30 retry 31 end 32・・・

clientserviceは取れてきています。

config/application.rb

Ruby

1module Api 2 class Application < Rails::Application 3 config.api_only = true 4 config.middleware.use ActionDispatch::Cookies 5 config.middleware.use ActionDispatch::Session::CookieStore 6 config.autoload_paths += %W(#{config.root}/lib) 7 8 config.action_dispatch.default_headers = { 9 'Access-Control-Allow-Credentials' => 'true', 10 'Access-Control-Allow-Origin' => '*', 11 'Access-Control-Request-Method' => '*' 12 } 13 14 config.middleware.insert_before 0, Rack::Cors do 15 allow do 16 origins '*' 17 resource '*', 18 headers: :any, 19 methods: [:get, :post, :put, :patch, :delete, :options, :head] 20 end 21 end 22 end

fetch_access_token!を実行したときも同じようなエラーが出てしまいます。
そもそもこのSignetを使わない方が良いようであれば、別のやり方をご教示いただくのも非常にありがたいです。。。

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

そもそものrefresh_tokenの指定が間違っていました。
ありがとうございます。

投稿2018/10/11 10:54

yamady

総合スコア176

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問