Войти через Google Gmail - PullRequest
1 голос
/ 31 мая 2019

Возникли проблемы со входом в Google.Попытка использовать его в Ruby on Rails и JavaScript с гемом devise.Я сделал регистрацию в консоли Google, но пока ничего не получалось.Я получаю ошибку OAuth::Unauthorized.

# app/controllers/callbacks_controller.rb

def redirect
  client = Signet::OAuth2::Client.new({
    client_id: ENV.fetch('Google ID'),
    client_secret: ENV.fetch('Google secret'),
    authorization_uri: 'https://accounts.google.com/o/oauth2/auth',
    scope: Google::Apis::GmailV1::AUTH_GMAIL_READONLY,
    redirect_uri: url_for(:action => :callback)
  })

  redirect_to client.authorization_uri.to_s
end

def callback
  client = Signet::OAuth2::Client.new({
    client_id: ENV.fetch('Google ID'),
    client_secret: ENV.fetch('Google secret'),
    token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
    redirect_uri: url_for(:action => :callback),
    code: params[:code]
  })

  response = client.fetch_access_token!

  session[:access_token] = response['access_token']

  redirect_to url_for(:action => :labels)
end

# app/controllers/sessions_controller.rb

def googleAuth

  access_token = request.env["omniauth.auth"]
  user = User.from_omniauth(access_token)
  log_in(user)

  user.google_token = access_token.credentials.token

  refresh_token = access_token.credentials.refresh_token
  user.google_refresh_token = refresh_token if refresh_token.present?
  user.save
  redirect_to root_path
end

# config/initializers/ominauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, ENV['google id'],
  ENV['google secret']
end

# Gemfile

gem 'omniauth-google-oauth2'
gem 'google-api-client', '~> 0.9', require: 'google/apis/gmail_v1'

# config/routes.rb

devise_for :users, :controllers => { :omniauth_callbacks => "callbacks" }

get "auth/:provider/callback", to: "sessions#googleAuth"
get "auth/failure", to: redirect("/")

# app/model/user.rb

devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable,
       :omniauthable, :omniauth_providers => [:google]

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.provider = auth.provider
    user.uid = auth.uid
    user.email = auth.info.email
    user.password = Devise.friendly_token[0,20]
  end
end

Я хочу, чтобы мои пользователи могли зарегистрироваться и войти в систему, используя свои учетные записи Gmail.Вероятно, после всех попыток мой код стал немного грязным, и я уверен, что есть лучшее и более чистое решение, которое я пока не смог найти.

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