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

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

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

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

2831閲覧

Railsのgoogle-api-clientでリフレッシュトークンを使ってアクセストークンを更新したい

r-kurokw

総合スコア14

Ruby on Rails 5

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2019/04/06 11:59

編集2022/01/12 10:55

google-api-clientを使って、Gmailの本文等を取得する機能を作りたいと思っています。
実装手順は以下の通りです。

  1. Google認証機能
  2. 認証によって得られたアクセストークンを使って、メッセージIDを取得
  3. 各メッセージIDごとに本文を取得

1については、以下のようなコードを書いています。

Rails

1 def redirect 2 client = Signet::OAuth2::Client.new({ 3 client_id: ENV['GOOGLE_CLIENT_ID'], 4 client_secret: ENV['GOOGLE_SECRET_KEY'], 5 authorization_uri: 'https://accounts.google.com/o/oauth2/auth', 6 scope: Google::Apis::GmailV1::AUTH_GMAIL_READONLY, 7 redirect_uri: url_for(:action => :callback), 8 }) 9 10 redirect_to client.authorization_uri.to_s 11 end 12 13 def callback 14 client = Signet::OAuth2::Client.new({ 15 client_id: ENV['GOOGLE_CLIENT_ID'], 16 client_secret: ENV['GOOGLE_SECRET_KEY'], 17 }) 18 19 client.token_credential_uri = 'https://www.googleapis.com/oauth2/v3/token' 20 client.redirect_uri = url_for(action: :callback) 21 client.code = params[:code] 22 response = client.fetch_access_token! 23 session[:access_token] = response['access_token'] 24 25 redirect_to '/gmail_messages' 26 end 27

2と3についてもコードはほぼほぼ完成していて、アクセストークンが有効であれば本文取得はできています。

Rails

1 def get_messages_id(token, query) 2 uri = URI.encode("https://www.googleapis.com/gmail/v1/users/me/messages?q=#{query}") 3 uri_parse = URI.parse(uri); 4 request = Net::HTTP::Get.new(uri_parse.request_uri) 5 6 http = Net::HTTP.new(uri_parse.hostname, uri_parse.port) 7 http.use_ssl = true 8 http.verify_mode = OpenSSL::SSL::VERIFY_NONE 9 request = Net::HTTP::Get.new(uri_parse.request_uri) 10 request["Authorization"] = "Bearer #{token}" 11 response = http.request(request) 12 13 JSON.parse(response.body) 14 end 15 16 def get_messages_body(token, id) 17 uri_parse = URI.parse("https://www.googleapis.com/gmail/v1/users/me/messages/#{id}") 18 request = Net::HTTP::Get.new(uri_parse.request_uri) 19 20 http = Net::HTTP.new(uri_parse.hostname, uri_parse.port) 21 http.use_ssl = true 22 http.verify_mode = OpenSSL::SSL::VERIFY_NONE 23 request = Net::HTTP::Get.new(uri_parse.request_uri) 24 request["Authorization"] = "Bearer #{token}" 25 response = http.request(request) 26 27 JSON.parse(response.body) 28 end

あとは、リフレッシュトークンを使ってアクセストークンを更新するところを実装したいのですが、client.refresh!を実行すると、
ArgumentError: Missing token endpoint URI.
のエラーが出てしまいます。

Rails

1 client = Signet::OAuth2::Client.new({ 2 client_id: ENV['GOOGLE_CLIENT_ID'], 3 client_secret: ENV['GOOGLE_SECRET_KEY'], 4 refresh_token: ENV['GOOGLE_ACCESS_TOKEN'], 5 grant_type: 'refresh_token' 6 }) 7 8 binding.pry

間違っている箇所あれば教えていただきたいです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問