用于gmail的omniauth oauth令牌无效

时间:2011-04-11 00:38:41

标签: ruby oauth gmail devise omniauth

我正在尝试获取一个可以与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脚本的同一个消费者一起工作。

2 个答案:

答案 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获取电子邮件的工作示例。此示例使用mailgmail_xoauthomniauthomniauth-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