除了使用 Google+ 登录按钮之外,我无法在网上找到答案必须。
我有一个 Ruby on Rails 应用程序(ruby v1.9.3,rails v3.2.13),我在其中连接了 OmniAuth,并且正在使用 google_oauth2 gem 与 Google+ 集成。
我的简单目标是允许用户通过 Google+ 进行身份验证,授予对我的 Google API 项目的访问权限,然后能够使用 google-api-client gem 向 Google+ 用户的保险库发布片刻。
我已经设置了我的 Google API 项目,为 Web 应用程序创建了 OAuth 2.0,并启用了 Google+ API 服务。
我使用以下提供程序进行了 OmniAuth 设置,并且添加了 request_visible_actions 选项以允许我发布(我认为这是正确的,但在我在线查看的任何代码示例中都没有看到它使用过......):
provider :google_oauth2, CLIENT_ID, CLIENT_SECRET, {
access_type: 'offline',
scope: 'userinfo.email,userinfo.profile,plus.me,https://www.googleapis.com/auth/plus.login',
request_visible_actions: 'http://schemas.google.com/AddActivity',
redirect_uri: 'http://localhost/auth/google_oauth2/callback'
}
当我将用户重定向到 /auth/google_oauth2 时,它会将用户发送到 Google+ 以授权我的应用程序,当用户批准时,它会返回到我的回调,我可以在其中访问 request.env["omniauth.auth"] 并且它有我期望的所有信息,包括令牌、电子邮件地址等。我从 auth["credentials"]["token"] 存储 access_token。
到目前为止一切顺利,对吧?
当我尝试使用以下代码发布时刻时,我遇到一个异常,指示 401 未经授权的错误。
client = Google::APIClient.new
client.authorization.access_token = self.access_token
plus = client.discovered_api('plus', 'v1')
moment = {
:type => 'http://schemas.google.com/AddActivity',
:target => { :id => Time.now.to_i.to_s,
:description => message,
:name => message
}
}
# post a moment/activity to the vault/profile
req_opts = { :api_method => plus.moments.insert,
:parameters => { :collection => 'vault', :userId => 'me', },
:body_object => moment
}
response = client.execute!(req_opts).body
我也试过更换
client.authorization.access_token = self.access_token
和
credentials = Hash.new
credentials[:access_token] = self.access_token
credentials[:refresh_token] = self.refresh_token
credentials[:expires_at] = self.expires_at
client.authorization.update_token!(credentials)
但没有运气。
我认为这个问题要么与:
- OmniAuth 未正确向 Google 发出 request_visible_actions
- 我没有在 Google::APIClient 对象中正确设置令牌
我已经使用以下资源走了这么远,但我正式陷入困境:
- http://blog.baugues.com/google-calendar-api-oauth2-and-ruby-on-rails
- https://developers.google.com/+/api/latest/moments/insert
任何想法,将不胜感激!