【问题标题】:AppAuth or manually implementing OAuth2.0 in AndroidAppAuth或在Android中手动实现OAuth2.0
【发布时间】:2021-03-12 02:57:30
【问题描述】:

我试图理解 - AppAuth SDK 真的有什么用? 我有一个网站(在 OAuth2.0 中充当用户代理),用户在其中插入他的凭据。 我向这个网站传递了一个重定向 URL 作为参数,一旦用户通过网站内部的验证过程,网站就会发送重定向 URL 以及访问令牌。

如果我没记错的话,我有几个选择:

  1. WebView - 只需捕获shouldOverrideUrlLoading 回调,并从 url 检索访问令牌。这种方法有什么缺点?
  2. 对 Chrome 自定义标签做同样的事情?
  3. 对 Trusted Web Activity 做同样的事情吗?
  4. 以某种方式集成 AppAuth SDK,但它真正为我们提供了哪些以前的方法不能做或不能处理的事情?

它是否可以处理我可能需要数字资产链接的事实?我真的需要它吗?

【问题讨论】:

    标签: android authentication oauth-2.0


    【解决方案1】:

    关于 AppAuth 库作用的一些注意事项:

    • 基于标准的移动安全 - 如OAuth 2.0 for Native Apps 所述
    • 实施推荐的授权代码流 (PKCE) 流程
    • 通过系统浏览器登录(不推荐通过 Web Views 登录)
    • 作为经过认证的图书馆,它可以为您的公司提供良好的安全广告
    • 良好的登录可用性 - 密码自动填充之类的东西可以工作

    不过,可靠地集成这些库是一项艰巨的工作。选择解决方案总是需要根据您和您的利益相关者最关心的内容进行权衡。如果有帮助,我会提供一些详细但直观的博客文章和一个您可以运行的应用程序,以帮助您进行评估:

    【讨论】:

    • 嗨,Gary,感谢您的博客,我在 2 周前发现了您的博客,我认为这是迄今为止关于移动设备 OAuth2 最完整的指南之一,强烈推荐给任何想要深入了解的人了解移动设备上的 OaAuth2。
    【解决方案2】:

    AppAuth 只是一个库,其中包含很少的预定义方法,这对于任何 OAuth 提供者来说都很常见。例如,Microsoft 使用基于 AppAuth 的MSAL,有助于验证用户并获取访问令牌。

    但是,您绝对可以在不使用AppAuth 的情况下自行实现。您可以打开 ChromeCustomTab 并收听重定向 URL。

    例如

    <activity
        android:name=".ui.activity.LoginActivity"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"
        android:theme="@style/BaseTheme.Login">
    
        <intent-filter android:label="@string/activity_login">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
    
            <data
                  android:host="oauth2redirect"
                  android:scheme="com.example.appname" />
        </intent-filter>
    </activity>
    

    正如您在上面看到的,打开 ChromeCustomTab 的登录页面会侦听重定向 URL,即 com.example.appname://oauth2redirect,其中将包含身份验证代码。您的实现可能会有所不同,但核心原则保持不变。

    您还可以查看here 以了解有关使用 ChromeCustomTab 进行 OAuth 的更多信息。

    【讨论】:

    • 谢谢。您如何确保您定义的此方案只能调用/调用您的应用程序,而不是设备上与清单中的方案匹配的任何应用程序?使用数字资产链接?在这种情况下,您为什么更喜欢使用 ChromeCustomTab 而不是 Trusted Web Activity ?
    • 理想情况下,我们使用包名作为方案(对于本机应用程序),因为在 Google Play 商店中不能存在具有相同签名的其他包,从而保持唯一性。使用 CCT 是因为它有一个预热选项,可以通过在后台预先缓存来立即打开登录页面。 AppAuth 和 MSAL 也使用 CCT 进行身份验证。
    • 但是如果用户在设备上安装了另一个应用程序,其中一个活动与您的应用程序的包名称具有相同的方案,那么是否有可能绕过恶意应用程序的限制?因为从本质上讲,您将拥有两个具有可以由同一方案打开的活动的应用程序。谢谢
    • 是的,但记住通常收到的身份验证码并不意味着它是访问令牌。第二层防御是使用身份验证代码使用客户端密码获取访问令牌,我确信其他应用程序不会拥有此密码。这个实现再次特定于我的用例,但你明白了:)
    • 我明白了,虽然您的客户端密码可能存储在应用程序中,因此理论上可以反编译和检索,然后我们又回到了同样的问题.. 但是我们可以简单地使用 Digital Asset Link 来解决方案打开多个应用程序而不仅仅是我们的问题。但是 - 在这种情况下,该方案必须以“https://....”开头,以验证与主机的域。所以这是我猜的唯一解决方案。在任何情况下,我真的认为使用 AppAuth 没有任何好处。实际的实现似乎并不难,不得不求助于 3-rd 方库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多