4

我正在玩 OpenID Connect 和 OAuth,我想支持多个 OpenID 提供者(所以不仅仅是 AccountManager 知道的那些)。但是,我遇到了这个问题。

当作为已安装应用程序对 Google 进行身份验证时,您将一个回调地址(由 Google 预先定义)传递给http://localhost. 因此,我通过重定向到 Google 的端点来启动 OAuth 流程,如下所示:

String url = "https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&state=%2F&redirect_uri=http%3A%2F%2Flocalhost%3A9999&response_type=code&client_id=000000000000000.apps.googleusercontent.com";
Intent i = new Intent (Intent.ACTION_VIEW);
i.setData (Uri.parse (url));
startActivity (i);

请注意,我根据需要传递了 redirect_uri(端口 9999,这是允许的)。我已注册我的应用程序以响应正在加载的此类地址,如下所示:

<data android:scheme="http" android:host="localhost" android:port="9999" />

但是,这会导致系统显示“完成操作”对话框:

在此处输入图像描述

因此,由于手机的 9999 端口没有监听,如果用户选择浏览器,浏览器将显示错误页面,整个身份验证流程将中断。

我怎样才能避免这种情况?

4

3 回答 3

1

尝试使重定向 url 具有不同的方案,例如app://localhost. 所有浏览器都注册为 and 的处理程序httphttps因此部分问题无法解决。但是,如果重定向 URL 可以具有非标准方案,那么您的问题将很容易解决。发明你自己的方案并使用它(很多应用程序都这样做,fb://例如 Facebook 有链接)。

于 2013-06-12T21:05:35.377 回答
0

在应用程序中直接显示的WebView中执行身份验证。

以下是如何使其加载 OAuth 页面的简短示例,以及如何检测浏览器何时尝试重定向到您的 oauth 回调。此时,只需获取令牌并关闭登录活动或对话框。

这样您就不需要注册您的应用程序来处理方案或端口,因为不使用外部 Web 浏览器。

webView = findViewById(R.id.wv);
webView.setWebViewClient(new WebViewClient(){
   final String cb = "http://your_oauth_callback_uri";
   @Override
   public void onPageStarted(WebView view, String url, Bitmap favicon){
   if(url.startsWith(cb)) {
      view.stopLoading();
      Uri uri = Uri.parse(url);
      String token = uri.getQueryParameter("oauth_token");
      // TODO do whatever you need with token
   }
});
webView.loadUrl(uri);

您必须完成其余的工作 - 活动、布局等。

注意:此代码取自我的 OAuth 1 应用程序,但也适用于您的情况,除了返回的 oauth_token 参数可能具有不同的名称。

于 2013-06-12T08:48:56.553 回答
0

没有简单的方法可以解决这个问题。Android 不允许一个活动优先于另一个活动来处理给定的意图,这始终是用户的选择。对于这种登录流程,您应该使用 AccountManager 或 WebView,而不是浏览器(请参阅此处)。Google 不太可能是唯一一个不允许使用任意 URL 方案作为回调的 OpenID 提供商;我可以想象一些模糊的安全原因。

一般的 Android 用户会期望你使用 AccountManager;这是许多受信任的应用程序使用的熟悉的 UI。即使您将它们发送到浏览器工作,我怀疑许多技术含量较低的用户会发现这令人惊讶并且无论如何都会担心它,即使他们拥有您提到的浏览器 chrome/etc 的理论舒适度。

如果您真的希望它使用浏览器工作,您将不得不在一个随机端口号上实际启动一个小型 HTTP 服务器并使用该端口作为回调(已安装应用程序 OpenID 的工作方式);不是不可能,但也不是微不足道的。

于 2013-06-14T06:54:11.493 回答