存储在Android帐户为Rails +设计帐户认证(Stored Android Accounts

2019-09-21 22:28发布

总结:我试图使用存储谷歌账号上的Android应用程序在本地应用来验证用户身份,通过一个Rails 3提供+设计应用程序的API,和我被困。

详细信息:我们有一个应用程序(http://push-poll.com),它可以让用户从一帮自己的朋友收集反馈。 我们还内置了原生Android应用程序。 我们的web应用程序允许您与您的谷歌帐户登录,我们希望这些功能扩展到原生的Android应用程序。 Web应用程序达到了这个标准制定(帐户权限)+ Omniauth(对于谷歌帐户信息和OAuth交互)。

版本:安卓2.1+,Rails的3.2.2,2.1.2设计,Omniauth 1.1.0

建议验证工作流程:

  1. 用户点击的Android应用程序“与谷歌帐户登录”
  2. 用户使用的AccountManager Android装置上选择一个存储帐户,并给出许可
  3. Android应用程序发送谷歌帐户令牌Rails的API
  4. Rails应用程序发送帐户令牌谷歌OAuth的API < -这是我被困
  5. 谷歌返回成功信息和账户信息(具体名称+电子邮件)
  6. 通过电子邮件地址Rails应用程序查找/创建用户
  7. Rails应用程序创建用户帐户/读取/更新访问令牌
  8. 导轨访问令牌回到了Android应用(这是我们的应用程序目前是如何处理与标准登录API访问)
  9. Android应用包括所有的API调用Rails的访问令牌

我已经冲刷谷歌的文档,但我完全卡住了(4)和(5)。 一旦我有谷歌提供的电子邮件地址,一切都按现在这样(对于标准登录或谷歌/ Omniauth /设计帐户)。 通过我最好的猜测,这可以通过以下任一操作来解决:

  • 创建一个与web应用程序共享的Android应用程序的API /密钥,以使谷歌帐户的API请求
  • 查找谷歌API端点我可以简单地验证对一个Android帐户令牌,并返回账户细节

我一直在敲打我的头靠在墙上就这一个,至少一个星期。

FYI:我是网络开发,我们的Android开发人员一直还跟我提供了废止Android应用程序会从安卓发送一个访问令牌我选择的API端点。

Answer 1:

好了,我可以用一点点更好地了解的OAuth的解决这个问题。 显然,令牌能够被不同的服务器之间传来传去,它并没有真正的问题谁拥有它们,它们继续发挥作用。

因此,使用Android的的AccountManager我能够提取足够的权限范围userinfo.email,然后发送到服务器的令牌。 然后服务器可以打:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=TOKENVALUE

注:这是正在通过HTTPS发送到Rails应用程序 - 你永远不应该以明文互联网发送的令牌。

下面是我们如何做到这一点的部分片段:

# Use Google's Token Verification scheme to extract the user's email address
token = params[:token]
uri = URI.parse("https://www.googleapis.com")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
path = "/oauth2/v1/tokeninfo?access_token=#{token}"
resp, data = http.get(path)
data = JSON.parse(data)
if resp.code == "200"
  # Find a user
  @user = User.where(:email => data["email"]).first
  if !@user
    #Create a user with the data we just got back
  end
else
  # Bad or revoked token 
end


文章来源: Stored Android Accounts for Authentication of Rails + Devise Accounts