3

如果内置 WebView 浏览器无法访问默认用户浏览器的 cookie,那么在 Android 中使用 OAuth 2.0 客户端授权有什么意义?我的意思是,如果我http://blablabla.com/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token在 WebView 中打开一些 oauth-url(例如 ) - 无论如何都会提示用户输入他的凭据以登录“blablabla.com”社交网络。因为即使他已经使用他的某些浏览器(Opera 或 Dolphin,或默认浏览器)登录,WebView 浏览器也不知道任何有关相应 cookie 的信息。


编辑:

我会尽量让它更清楚一点。

主要目标是简化我的应用程序中的登录程序。我想实现我们可以在许多网站上看到的这种机制:“登录... Facebook/Google/Twitter/whatever”。在桌面浏览器中,这种方法非常有效,因为最终用户已经在此浏览器中登录了目标服务。所以基本上要登录我的网站,他只需要:

  1. 按下“使用...登录”按钮
  2. 在重定向的窗口/弹出窗口上按“批准/确认”。
  3. 被重定向回来,已经登录。

主要好处是用户不需要输入他的电子邮件/姓名/任何东西——我已经从他的社交网络帐户中提取了它。

我想知道如何在 Android 上获得相同的效果。问题是,正如我所见,我们不能让用户避免输入密码,因为应用程序(WebView)永远不知道他是否登录到某个外部服务。这就是为什么无论如何都会提示用户输入他的一些详细信息,并且所有 OAuth 优势都将消失。

4

2 回答 2

2

解决方法取决于您要执行的操作。我不清楚,再次查看您的问题,因为您没有解释您的用例。相反,您间接要求一些看起来非常广泛的东西,就好像您想使用共享 cookie 维护跨越多个应用程序的 Android 系统范围的登录状态一样。

由于安全原因,这既不好也不想要。流氓应用程序可以对其他应用程序请求的现有访问令牌做任何它想做的事情,或者只是修改或读取在其他应用程序中创建和维护的现有 cookie。

假设您试图通过让用户使用 WebView 登录来使用 OAuth 2.0 授权您自己的应用程序访问 Web 服务,您需要实现自己的WebViewClient,覆盖其 onPageStarted 或 onPageFinished 方法并检查 URL 参数是否与您的重定向匹配网址。

如果有匹配项,您需要从 URL 字符串中提取访问令牌。如果还有可用的刷新令牌,则也提取该令牌。

(但这仅适用于特定类型的 OAuth 流,它将访问令牌添加到重定向 URL。)

现在您至少有一个可用的访问令牌。将该令牌存储在您的应用程序的私有首选项中,并在您的服务请求中使用它,直到您从服务返回 401 未授权错误消息。此时,您可以使用刷新令牌(如果可用)来请求新的访问令牌,或者您必须再次显示登录 WebView。

如果您尝试从您的应用程序访问 Google 服务,您可能会发现Tasks API 和 OAuth 2.0 入门文章很有用。

于 2012-06-30T14:56:36.837 回答
0

您是否考虑过从外部(非嵌入式)启动浏览器?

这将受益于现有的 cookie,并为用户在输入这些服务的凭据时提供最舒适的可信 UI。(换句话说 - 用户看到 SSL 锁、地址栏中的正确 URL 等)

于 2012-06-30T17:18:37.017 回答