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

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

ただいまの
回答率

89.06%

GoogleカレンダーAPIにおいてアクセストークンがないというエラーがでます。

受付中

回答 1

投稿 編集

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

qaz3330

score 113

GoogleカレンダーAPIを使用したく以下のようなスクリプトを使用してます。

require 'rubygems'
require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/file_storage'
require 'google/api_client/auth/installed_app'

require 'pp'
require 'json'

# 認証情報ファイルは確かにあります。
CREDENTIAL_STORE_FILE = "client_secret.json"

def setup()
  client = Google::APIClient.new(:application_name => 'Ruby hogehoge sample',
      :application_version => '1.0.0')

  # Oauth認証:google developers consoleの秘密鍵jsonを利用
file_storage = Google::APIClient::FileStorage.new(CREDENTIAL_STORE_FILE)
  if file_storage.authorization.nil?
    client_secrets = Google::APIClient::ClientSecrets.load

    flow = Google::APIClient::InstalledAppFlow.new(
      :client_id => client_secrets.client_id,
      :client_secret => client_secrets.client_secret,
      :access_token => client_secrets.authorization.access_token,
      :scope => %w(
        https://www.googleapis.com/auth/calendar.readonly
        https://docs.google.com/feeds/
        https://docs.googleusercontent.com/
        https://spreadsheets.google.com/feeds/
      ),
    )
    client.authorization = flow.authorize(file_storage)
  else
    client.authorization = file_storage.authorization
  end

  return client

end

client =setup()
cal = client.discovered_api('calendar', 'v3')

event = {
  'summary' => 'テスト予定タイトル',
  'start' => {
    'dateTime' => '2015-09-24T10:00:00+09:00',
    'timeZone' => 'Asia/Tokyo',
  },
  'end' => {
    'dateTime' => '2015-09-24T12:00:00+09:00',
    'timeZone' => 'Asia/Tokyo',
  }
}


p event

p "================================================="

result = client.execute(:api_method => cal.events.insert,
                        :parameters => {'calendarId' => 'primary'},
                        :body => JSON.dump(event),
                        :headers => {'Content-Type' => 'application/json'})

p result.status

ただ、これを実行すると以下のエラーがでます。
エラー内容を見る限りアクセストークンがないということはわかるのですが、このスプリクトのどこが悪いのかがわからなく困っております。

尚、他の方の実装例などを見ている際に、ブラウザが開いて、認証して・・・みたいな流れがあったみたいですが、私のケースではありませんでした。
おそらくそこが原因なのかなと思ってます。

助言を頂けると幸いです。
宜しくお願いします。

{"summary"=>"テスト予定タイトル", "start"=>{"dateTime"=>"2015-09-24T10:00:00+09:00", "timeZone"=>"Asia/Tokyo"}, "end"=>{"dateTime"=>"2015-09-24T12:00:00+09:00", "timeZone"=>"Asia/Tokyo"}}
"================================================="
/Users/vendor/bundle/ruby/2.2.0/gems/signet-0.7.2/lib/signet/oauth_2/client.rb:1042:in `generate_authenticated_request': Missing access token. (ArgumentError)
    from /Users/vendor/bundle/ruby/2.2.0/gems/google-api-client-0.8.2/lib/google/api_client/request.rb:241:in `to_env'
    from /Users/vendor/bundle/ruby/2.2.0/gems/google-api-client-0.8.2/lib/google/api_client/request.rb:161:in `send'
    from /Users/vendor/bundle/ruby/2.2.0/gems/google-api-client-0.8.2/lib/google/api_client.rb:638:in `block (2 levels) in execute!'
    from /Users/vendor/bundle/ruby/2.2.0/gems/retriable-1.4.1/lib/retriable/retry.rb:27:in `perform'
    from /Users/vendor/bundle/ruby/2.2.0/gems/retriable-1.4.1/lib/retriable.rb:15:in `retriable'
    from /Users/vendor/bundle/ruby/2.2.0/gems/google-api-client-0.8.2/lib/google/api_client.rb:635:in `block in execute!'
    from /Users/vendor/bundle/ruby/2.2.0/gems/retriable-1.4.1/lib/retriable/retry.rb:27:in `perform'
    from /Users/vendor/bundle/ruby/2.2.0/gems/retriable-1.4.1/lib/retriable.rb:15:in `retriable'
    from /Users/vendor/bundle/ruby/2.2.0/gems/google-api-client-0.8.2/lib/google/api_client.rb:626:in `execute!'
    from /Users/vendor/bundle/ruby/2.2.0/gems/google-api-client-0.8.2/lib/google/api_client.rb:669:in `execute'
    from get_yaml_2.rb:66:in `<main>'

こちらだとブラウザで許可リクエストなどが出てきて、.google-api.yamlが生成されるのですが、中身が空っぽのため、その後の認証(コメントアウトしてる部分)に失敗します・・・。

require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/installed_app'
require 'json'
require 'yaml'

client = Google::APIClient.new(
  :application_name => 'Example Ruby application',
  :application_version => '1.0.0'
)
plus = client.discovered_api('plus')

flow = Google::APIClient::InstalledAppFlow.new(
  :client_id => 'キーは実際には入れてます',
  :client_secret => 'キーは実際には入れてます',
  :scope => ['https://www.googleapis.com/auth/calendar']
)

#File.open("./.google-api.yaml", "w"){|f|
#  x = {
#    "mechanism" => "oauth_2",
#    "scope" => "https://www.googleapis.com/auth/calendar",
#    "client_id" => client_secrets.client_id,
#    "client_secret" => client_secrets.client_secret,
#    "access_token" => client.authorization.access_token,
#    "refresh_token" => client.authorization.refresh_token
#  }
#  f.puts(x.to_yaml)
#}

また、今後、他のユーザーがauth認証をする際にはこれらのスクリプトでできるのでしょうか?

現時点であまりイメージが湧いていなく、大丈夫か心配です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

アクセストークンがないというエラーです。
GoogleのOAuth2.0認証では、ユーザーが認証許可すると、"code"という名前でauthorization codeが返ってきます。この、"code"を、"access_token"と"refresh_token"に交換します。このaccess_tokenを用いて、APIにアクセスすることで、データを取得できます。
パッと見たところ、

:access_token => client_secrets.authorization.access_token,


の部分が怪しいと思います。
どうやってaccess_tokenを所得していますか?

以下の公式ドキュメントがとても参考になると思います。
https://developers.google.com/api-client-library/ruby/auth/web-app?hl=ja

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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