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

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

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

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

Gmail

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

OAuth

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

API

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

受付中

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

r-kurokw
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回答

0グッド

1クリップ

2341閲覧

投稿2019/04/06 11:59

編集2019/04/06 12:02

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

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

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Ruby on Rails 5

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

Gmail

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

OAuth

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

API

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