我正在尝试获取一个可以与gmail_xauth一起使用的oauth令牌(ruby gem) 查看用户的邮件。我首先用谷歌和我的注册我的应用程序 然后设置设计请求访问邮件:
config.omniauth :google, 'key', 'secret', :scope => 'https://mail.google.com/mail/feed/atom/'
然后我通过outh / openid流程,谷歌提示我 批准访问gmail,使用令牌将我重定向回应用程序 全知全权证书和秘密我的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脚本的同一个消费者一起工作。
答案 0 :(得分:5)
这对我有用:
config.omniauth :google, 'anonymous', 'anonymous', :scope => 'https://mail.google.com/'
我正在使用gmail gem,所以连接它看起来像这样:
gmail = Gmail.connect(:xoauth, auth.uid,
:token => auth.token,
:secret => auth.secret,
:consumer_key => 'anonymous',
:consumer_secret => 'anonymous'
)
我正在传递一个身份验证对象,但您将从env变量 env [“omniauth.auth”] 中获取它。我使用匿名/匿名密钥/秘密,因为我没有在谷歌注册我的域名,但我相信你可以here。它仍然可以与匿名/匿名合作,但谷歌只会警告用户。
答案 1 :(得分:3)
Google的OAuth1协议现已弃用,许多宝石尚未更新以使用其OAuth2协议。以下是使用OAuth2协议从Google获取电子邮件的工作示例。此示例使用mail
,gmail_xoauth
,omniauth
和omniauth-google-oauth2
宝石。
您还需要在Google's API console中注册您的应用以获取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