1

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

  1. Android 生成一些数据
  2. 用户选择 FG 或 T 帐户
  3. 获取授权令牌
  4. 通过 HTTPS POST 将数据+令牌上传到我们的网站
  5. 我们的网站(在 Django 中,没关系)将 Auth Token 发送到 FGT
  6. 如果FGTtrue喜欢该令牌,则返回,false如果不喜欢

目标是防止攻击者捏造数据并使用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 帖子展示如何以艰难的方式做困难的事情时,有人可以告诉我如何以简单的方式做一件简单的事情吗?

4

2 回答 2

1

线程“在第三方服务器上验证 Android 的 authToken ”回答了子问题“要点击什么简单的 URI 来测试令牌?”

对于谷歌来说,神奇的 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 在尝试获取授权令牌时提供 IOEXcelption ”之类的文档,可能会调用startActivity()来挑战用户授权此活动,或者它可能使用已存储在 AccountManager 中的令牌。(请注意,仅仅为了回调自己而实现一个类是有害的,特别是如果目标方法仅命名为run(),所以按照我说的做,不要像我做的那样做,孩子们!)

生成的令牌长 52 个字节,以 'ya29.' 开头,所以它可能是 _ 一个 access_token,而不是 331 个字符,它可能是一个 id_token。

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

{
  "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 和 Twitter 再做一次……

于 2013-10-15T00:13:44.780 回答
0

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

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

如果您访问位于https://developers.google.com/oauthplayground/的 Oauth2 Playground,您可以尝试使用范围和调用来获得适合您的。您将能够看到随后需要在您的应用中复制的 URL。

于 2013-10-14T05:45:59.743 回答