如何在不使用网页浏览的情况下将用户重定向到Google oauth后的应用中?

时间:2017-05-15 21:15:01

标签: android google-oauth google-oauth2

谷歌通过网络浏览禁止oauth的决定给我带来了巨大的麻烦。这是一个漫长而艰难的过程,转移到替代方案(我现在使用建议的AppAuth库)我收到用户投诉,指出如果不添加它们就无法链接帐户到chrome /他们的设备(据我所知,现在不可能以某种方式强制私人浏览会话)。我的最新问题涉及谷歌oauth签署另一项服务。这是场景:

用户想要将第三方服务链接到我的应用程序。他们在第三方服务上的帐户与Google帐户相关联。要使用此第三方服务进行身份验证,他们必须登录自己的Google帐户。问题是第三方服务允许http:// scheme重定向URI为他们的oauth,所以流程看起来像这样:

  1. 用户在他的Android设备上的应用程序
  2. 用户点击按钮可将其thirdparty帐户与我的应用
  3. 相关联
  4. 使用appauth库,我为第三方启动了包含oauth网址的浏览器或自定义标签,我们只需将其称为http://thirdparty.com/oauth
  5. 在该页面中,用户点击了一个"登录谷歌"按钮,触发谷歌oauth流程,然后他们按照这些流程向thirdparty提供他们的Google帐户令牌
  6. thirdparty thirdparty验证了他们的Google帐户后,用户批准访问我的应用
  7. thirdparty重定向到已注册的redirect_uri,然后在浏览器标签中打开,而不是重定向回我的应用程序。
  8. 问题在于第6步。因为我需要注册http://方案重定向URI,所以浏览器选项卡会尝试直接加载网页,即使我已经注册了我的应用来处理该特定网址。现在,如果用户无法使用谷歌登录,我可以轻松地在网页浏览中完成整个流程并手动捕获重定向,抓取令牌,但因为thirdparty允许用户为了链接他们的谷歌帐户,我无法使用网页浏览,因为谷歌会阻止用户在网页浏览中执行谷歌身份验证,所以我被迫转到我无法控制的应用或浏览器标签结束并且依赖于正常行为(通常不会)

    我做了很多搜索,看起来App Links可以通过将我的应用注册为链接的主要处理程序来解决我的问题,但这只适用于Android 6.0+,这比我的设备最低要高,所以我&# 39;我不知道我应该在这里做些什么。

    我的约束是:

    1. oauth重定向必须是HTTP方案(thirdparty所需)
    2. 我无法在网页浏览中进行身份验证(谷歌要求)
    3. 我需要我的身份验证重定向来启动我的应用程序才能收集令牌
    4. 我需要解决方案适用于Android 5.0 +上的所有设备
    5. 我没有通过数小时的搜索找到解决此问题的单一解决方案,而且我发现无法与Google oauth团队取得联系以了解他们的建议。

      有没有人找到办法让http://链接启动应用程序而不提示用户而不需要android 6.0?

2 个答案:

答案 0 :(得分:1)

如果您可以控制重定向URI,则可以将应用程序设置为使用自定义Intent Handler进行侦听。这实际上是深度链接的一种形式,应该与Android 5+一起使用,(在6中你甚至可以将你的应用设置为默认值!)。

对于数据,您很可能需要use the URI itself。但是,如果你能控制重新指挥,这不应该太难。

答案 1 :(得分:0)

只是更新清单,像这样:

<activity  
    android:name="com.example.oauthexample.LoginActivity"
    android:label="@string/app_name"
    android:configChanges="keyboard|orientation|screenSize">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="redirecturi"
            android:scheme="your" />
    </intent-filter>
</activity>  

并致电恢复:

@Override
protected void onResume() {  
    super.onResume();

    // the intent filter defined in AndroidManifest will handle the return from ACTION_VIEW intent
    Uri uri = getIntent().getData();
    if (uri != null && uri.toString().startsWith(redirectUri)) {
        // use the parameter your API exposes for the code (mostly it's "code")
        String code = uri.getQueryParameter("code");
        if (code != null) {
            // get access token
            // we'll do that in a minute
        } else if (uri.getQueryParameter("error") != null) {
            // show an error message here
        }
    }
}