在AccountManager..getAuthToken之后,如何将该令牌发送给其提供程序以进行身份​​验证?

时间:2013-10-13 15:16:06

标签: twitter-oauth google-oauth facebook-oauth android-account

我们正在编写一个包含Android视图和网站的应用。我们的应用程序需要将一些数据与Facebook,Google或Twitter(称为“FGT”)相关联,然后点击相关服务以返回true(如果该数据已通过身份验证)。控制流程是......

  1. Android会生成一些数据
  2. 用户选择FG或T帐户
  3. getAuthToken
  4. 通过HTTPS POST将数据+令牌上传到我们的网站
  5. 我们的网站(在Django中,不重要)将Auth Token发送给FGT
  6. 如果FGT喜欢该令牌,则返回true,如果不是,则false
  7. 目标是防止攻击者通过curl调制数据并将其投放到我们的网站。我们/不需要/需要将数据一直上传到F,G或T.我们不需要一直到混合应用程序,我们的Web服务自我验证F,G或T ,然后使用F,G或T的API以用户名发布,发送电子邮件或发推文。

    显然有一个简单的答案可以解决这个问题;希望只有三个URI,一个用于F,G或T,我可以插入Auth Token。这就是为什么我不想为每个Facebook,Google和Twitter下载和安装SDK,然后为每个案例编写大量特定于服务的代码。这会使代码变得混乱,当客户端请求Tumblr或MSN时,我会搞砸。

    (相关问题:getAuthToken()的第二个参数是什么?“啊”?“邮件”?)

    所以,当我继续阅读书籍,源代码和SO帖子,展示如何以艰难的方式做一些艰难的事情时,有人会告诉我如何轻松地做一件简单的事情吗?

2 个答案:

答案 0 :(得分:1)

线程“validating Android's authToken on third party server”回答​​了子问题“要测试令牌的简单URI是什么?”

Google的神奇uri是:https://accounts.google.com/o/oauth2/tokeninfo?access_token=%token_here%

接下来的问题是如何将访问令牌从getAuthToken中删除。那里的范围应尽可能地显示用户真正住在这里:

String SCOPE = "oauth2:https://www.googleapis.com/auth/userinfo.profile";
am.getAuthToken(a, SCOPE, false, this, null);

我的this类实现AccountManagerCallback<Bundle>并提供方法run(AccountManagerFuture<Bundle> result)。根据“Android AccountManagerFuture getResult gives IOEXcelption when trying to get authorization token”这样的文档,可能会调用startActivity()来质询用户授权此活动,或者它可能使用已存储在AccountManager中的令牌。 (请注意,实现一个类只是为了回调自己是有害的,特别是如果目标方法只命名为run(),那么就像我说的那样,孩子们!)

结果令牌长度为52个字节,以“ya29。”开头,所以它可能是一个access_token,而不是331个字符,这可能是一个id_token。

生成的令牌未绑定到任何特定通道(其中“channel”是一组唯一的客户端,服务器和范围)。所以,从一个简单的卷曲,我可以用它来点击/tokeninfo URI,并得到这个(擦洗)JSON智慧:

{
  "issued_to" : "442575845966-mde4be7eingpb5pntfs839jipsetro6s.apps.googleusercontent.com",
  "audience" : "424242424242-mde4ab7defghi5jklmn839opqrstuv6s.apps.googleusercontent.com",
  "user_id" : "424242424242424242424",
  "scope" : "https://www.googleapis.com/auth/userinfo.profile",
  "expires_in" : 2272
}

所以这个答案对我来说已经形成了我试图阅读的所有其他文档之间缺失的联系。 Aaand现在我需要再次为Facebook&amp;微博...

答案 1 :(得分:0)

有一个简单的网址。 每个authtoken都是针对范围授予的。每个范围都允许authtoken执行某些操作。如果你尝试做范围允许的事情,那么根据authtoken的有效性,事情就会失败或成功。

最简单的请求范围可能是“电子邮件”。

如果您前往https://developers.google.com/oauthplayground/的Oauth2游乐场,您可以尝试使用范围和电话来获得适合您的游乐场。您将能够在应用中看到需要复制的网址。