как получить электронную почту с Google API - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь написать код для подключения к моей учетной записи Gmail, чтобы управлять им из приложения rails. Пока что все выглядит хорошо с кодом, который у меня есть ниже. Код создаст auth_client и сохранит его в сеансе как json, например:

require 'google/api_client/client_secrets'

class GoogleController < ApplicationController
  def redirect
    redirect_to auth_client.authorization_uri.to_s
  end

  def callback
    auth_code = params[:code]
    auth_client.code = auth_code
    auth_client.fetch_access_token!

    session["auth_client"] = auth_client.to_json

    redirect_to settings_path
  end

  private

  def auth_client
    @auth_client ||= begin
      client_secrets = Google::APIClient::ClientSecrets.load("config/google.json")

      auth_client = client_secrets.to_authorization

      auth_client.update!(
        :scope => [
          'https://www.googleapis.com/auth/gmail.send',
          'https://www.googleapis.com/auth/userinfo.email',
          'https://www.googleapis.com/auth/userinfo.profile'
        ],
        :redirect_uri => 'http://localhost:5000/google/callback',
        :additional_parameters => {
          "access_type" => "offline",
          "include_granted_scopes" => "true"
        }
      )

      auth_client
    end
  end
end

Теперь, после перенаправления, когда у меня есть клиент авторизации в сеансе, я могу получить информацию о пользователе, используя следующий код:

require "google/apis/people_v1"

class SettingsController < ApplicationController
  def show
    service = Google::Apis::PeopleV1::PeopleServiceService.new
    service.authorization = auth_client

    results = service.get_person("people/me", person_fields: ["emailAddresses"])

    raise
  end

  def auth_client
    client_opts = JSON.parse(session[:auth_client])
    Signet::OAuth2::Client.new(client_opts)
  end
end

Это также работает, но из того, что я вижу, он возвращает массив emailAddresses. Но мне интересно, есть ли лучший способ получить письмо, которое использовалось после аутентификации? Думаю, я не до конца понимаю, почему для пользователя существует несколько адресов электронной почты. Все, что я действительно хочу, - это электронное письмо, с которым аутентифицировался пользователь. Если emailAddresses является массивом, как я могу быть уверен, что электронная почта, которая использовалась для аутентификации, является той, которую я хочу?

К вашему сведению raise в контроллере является преднамеренным - я использую лучшую консоль ошибок для проверки переменные и поиграть с кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...