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

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

ただいまの
回答率

89.07%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,597

yamady

score 177

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

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

class SyncCalendarService

  attr_accessor :appointment, :user

  CLIENT_OPTIONS = {
    client_id: ENV['GOOGLE_ID'],
    client_secret: ENV['GOOGLE_SECRET'],
    authorization_uri: 'https://accounts.google.com/o/oauth2/auth',
    token_credential_uri: 'https://www.googleapis.com/oauth2/v4/token',
    scope: Google::Apis::CalendarV3::AUTH_CALENDAR,
    redirect_uri: 'http://localhost:3000',
    additional_parameters: {prompt:'consent'},
  }

  def initialize(task,user)
    @task = task
    @user = task.user
  end

  def create_event
    client = Signet::OAuth2::Client.new(CLIENT_OPTIONS)
    client.update!(user.google_api_token)
    service = Google::Apis::CalendarV3::CalendarService.new
    service.authorization = client
    service.insert_event(user.calendar_id, calendar_event)
    rescue Google::Apis::AuthorizationError
      # これが実行できない
      response = client.refresh!
      user.google_api_token = user.google_api_token.merge(response)
      retry
  end
・・・

clientserviceは取れてきています。

config/application.rb

module Api
  class Application < Rails::Application
    config.api_only = true
    config.middleware.use ActionDispatch::Cookies
    config.middleware.use ActionDispatch::Session::CookieStore
    config.autoload_paths += %W(#{config.root}/lib)

    config.action_dispatch.default_headers = {
      'Access-Control-Allow-Credentials' => 'true',
      'Access-Control-Allow-Origin' => '*',
      'Access-Control-Request-Method' => '*'
    }

    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins '*'
        resource '*',
          headers: :any,
          methods: [:get, :post, :put, :patch, :delete, :options, :head]
      end
    end
  end

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る