存储的Rails +设计帐户身份验证的Android帐户

时间:2012-08-29 17:22:01

标签: android ruby-on-rails oauth devise oauth-2.0

摘要:我正在尝试在Android应用程序上使用存储的Google帐户来验证本机应用程序中的用户,使用Rails 3 + Devise应用程序提供的API,而且我被卡住了。

详细说明: 我们有一个应用程序(http://push-poll.com),它允许用户从他们的朋友那里收集反馈。我们还构建了一个原生的Android应用程序。我们的网络应用允许您使用自己的Google帐户登录,我们希望将该功能扩展到原生Android应用。 Web应用程序通过Devise(用于帐户权限)+ Omniauth(用于Google帐户信息和OAuth交互)完成此操作。

版本: Android 2.1 +,Rails 3.2.2,Devise 2.1.2,Omniauth 1.1.0

建议的身份验证工作流程:

  1. 用户在Android应用中点击“使用Google帐户登录”
  2. 用户使用AccountManager在Android设备上选择存储的帐户并授予权限
  3. Android应用将Google帐户令牌发送到Rails API
  4. Rails应用将帐户令牌发送到Google OAuth API< - 这就是我被困的地方
  5. Google会返回成功和帐户信息(特别是姓名+电子邮件)
  6. Rails app通过电子邮件地址查找/创建用户
  7. Rails app从用户帐户创建/读取/更新访问令牌
  8. Rails访问令牌重新调整为Android应用程序(这是我们的应用程序当前使用标准登录方式处理api访问的方式)
  9. Android应用包括所有API调用中的Rails访问令牌
  10. 我搜索过谷歌的文档,但我完全坚持(4)和(5)。一旦我获得了谷歌提供的电子邮件地址,一切都像现在一样(对于标准登录或Google / Omniauth / Devise帐户)。根据我的最佳猜测,这可以通过以下任一方式解决:

    • 为与Web应用共享的Android应用创建API /密钥,以便发出Google帐户API的请求
    • 查找Google API端点我只需验证Android帐户令牌并返回帐户详细信息
    • 即可

    至少一个星期以来,我一直在撞墙上撞墙。

    仅供参考:我是网络开发者,我们的Android开发人员已经非常友好地为我提供了一个擅长的Android应用程序,它将从Android发送访问令牌到我选择的API端点。

1 个答案:

答案 0 :(得分: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