google-api-client
を使って、Gmailの本文等を取得する機能を作りたいと思っています。
実装手順は以下の通りです。
- Google認証機能
- 認証によって得られたアクセストークンを使って、メッセージIDを取得
- 各メッセージ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
間違っている箇所あれば教えていただきたいです。
あなたの回答
tips
プレビュー