#ruby #oauth #gmail #devise #omniauth
#ruby #oauth #gmail #разработать #omniauth
Вопрос:
Я пытаюсь получить токен oauth, который я мог бы использовать с gmail_xauth (ruby gem) для просмотра почты пользователя. Сначала я зарегистрировал свое приложение в Google, а затем настроил devise для запроса доступа к почте:
config.omniauth :google, 'key', 'secret', :scope => 'https://mail.google.com/mail/feed/atom/'
Затем я просматриваю поток outh / OpenID, и Google предлагает мне
подтвердите доступ к gmail, перенаправив меня обратно в приложение с помощью токена a
и секретны в учетных данных omniuth и в моей учетной записи Google перечислены мои приложения
как авторизованные для доступа к моим данным. Пока все хорошо.
Теперь, когда я беру эти учетные данные и пытаюсь использовать их с gmail_xoauth следующим образом:
require 'gmail_xoauth'
imap = Net::IMAP.new('imap.gmail.com', 993, usessl = true, certs =
nil, verify = false)
imap.authenticate('XOAUTH', '...@gmail.com',
:consumer_key => 'key,
:consumer_secret => 'secret',
:token => 'omniauth_returned_token',
:token_secret => 'omniauth_returned_secret'
)
Я получаю сообщение об ошибке «Net:: IMAP:: NoResponseError: Недопустимые учетные данные
(Сбой)».
Интересно, что следуя gmail_xoauth README для генерации токена с тем же пользователем с помощью скрипта python, это действительно работает.
Комментарии:
1. Нашли ли вы решение этой проблемы?
2. Здесь то же самое. Вы нашли решение?
3. У меня были похожие проблемы, но я нашел решение. Смотрите мой ответ ниже.
Ответ №1:
У меня это работает:
config.omniauth :google, 'anonymous', 'anonymous', :scope => 'https://mail.google.com/'
Я использую gem gmail, поэтому для подключения он выглядит следующим образом:
gmail = Gmail.connect(:xoauth, auth.uid,
:token => auth.token,
:secret => auth.secret,
:consumer_key => 'anonymous',
:consumer_secret => 'anonymous'
)
Я передаю объект аутентификации, но вы получите его из переменной env env[«omniauth.auth»]. Я использую anonymous / аноним для ключа / секрета, поскольку я не зарегистрировал свой домен в Google, но я полагаю, что вы можете здесь. Это все равно будет работать с anonymous / аноним, но Google просто предупредит пользователя.
Комментарии:
1. анонимные работы. Спасибо… просто интересно, как получить контакты
2. Похоже, это больше не работает — секрет равен нулю, когда я обращаюсь к объекту omniauth. Существует отдельная ссылка, которая работает на blog.asif.in/blog/2012/03/03/google-oauth-and-rails но я не смог заставить это работать.
Ответ №2:
Протокол OAuth1 от Google в настоящее время устарел, и многие gems еще не обновлены для использования своего протокола OAuth2. Вот рабочий пример получения электронной почты от Google с использованием их протокола OAuth2. В этом примере используются mail
, gmail_xoauth
omniauth
и omniauth-google-oauth2
драгоценные камни.
Вам также потребуется зарегистрировать свое приложение в консоли API Google, чтобы получить свои токены API.
# in an initializer:
ENV['GOOGLE_KEY'] = 'yourkey'
ENV['GOOGLE_SECRET'] = 'yoursecret'
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, ENV['GOOGLE_KEY'], ENV['GOOGLE_SECRET'], {
scope: 'https://mail.google.com/,https://www.googleapis.com/auth/userinfo.email'
}
end
# ...after handling login with OmniAuth...
# in your script
email = auth_hash[:info][:email]
access_token = auth_hash[:credentials][:token]
imap = Net::IMAP.new('imap.gmail.com', 993, usessl = true, certs = nil, verify = false)
imap.authenticate('XOAUTH2', email, access_token)
imap.select('INBOX')
imap.search(['ALL']).each do |message_id|
msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
mail = Mail.read_from_string msg
puts mail.subject
puts mail.text_part.body.to_s
puts mail.html_part.body.to_s
end
Комментарии:
1. Кажется, я все еще получаю сообщение об ошибке, когда у меня неверные учетные данные.
2. Я все еще получаю недействительные учетные данные с этим ответом.