摘要:我正在尝试在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
建议的身份验证工作流程:
我搜索过谷歌的文档,但我完全坚持(4)和(5)。一旦我获得了谷歌提供的电子邮件地址,一切都像现在一样(对于标准登录或Google / Omniauth / Devise帐户)。根据我的最佳猜测,这可以通过以下任一方式解决:
至少一个星期以来,我一直在撞墙上撞墙。
仅供参考:我是网络开发者,我们的Android开发人员已经非常友好地为我提供了一个擅长的Android应用程序,它将从Android发送访问令牌到我选择的API端点。
答案 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