Security 这个OAuth2本机应用程序流可以被认为是安全的吗?

Security 这个OAuth2本机应用程序流可以被认为是安全的吗?,security,mobile,oauth,openid-connect,Security,Mobile,Oauth,Openid Connect,我有一个OpenID连接提供程序,使用IdentityServer4和ASP.NET标识构建,运行在:login.example.com 我有一个SPA应用程序运行在SPA.example.com上,它已经使用我的OpenID连接提供商通过login.example.com对用户进行身份验证,并授权他们访问SPA 我有一个移动应用程序(在两个平台上都是本地的),目前正在使用自定义身份验证系统 我认为最好摆脱自定义身份验证系统,而是允许我的用户使用他们在SPA上使用的相同帐户登录,使用我的Open

我有一个OpenID连接提供程序,使用IdentityServer4和ASP.NET标识构建,运行在:
login.example.com

我有一个SPA应用程序运行在
SPA.example.com
上,它已经使用我的OpenID连接提供商通过
login.example.com
对用户进行身份验证,并授权他们访问SPA

我有一个移动应用程序(在两个平台上都是本地的),目前正在使用自定义身份验证系统

我认为最好摆脱自定义身份验证系统,而是允许我的用户使用他们在SPA上使用的相同帐户登录,使用我的OpenID提供程序

因此,我开始查看OpenID connect网站,并重新阅读,在几次google搜索之后,我意识到这是一个常见问题,我发现(OAuth2用于本机客户端),还有客户端动态注册()和PKCE()

我对这样一个事实感到挠头:在客户端/第三方(本机应用程序)上不再可能存储任何类型的“秘密”,因为它可能会被泄露

我与一些同事讨论了这个话题,我们得出了以下设置:

  • 使用Apple和Android将一个域(比如
    app.example.com
    )关联到我的移动应用程序
  • 对两个客户端使用AuthenticationCode流,并强制它们使用PKCE
  • 在应用程序关联的域上使用
    重定向\u uri
    ,例如:
    https://app.example.com/openid
  • 让用户在登录后始终同意登录应用程序,因为iOS或Android都不会通过执行自动重定向来恢复应用程序,所以每次手动单击universal/app链接的用户必须是用户
  • 我在这两个应用程序上都使用了AppAuth库,现在在测试中一切正常,但我想知道:

  • 你认为这是一种安全的方法,可以防止任何具有正确技能的人冒充我的应用程序或通过任何其他方式未经授权访问我的API吗?目前实现这一目标的最佳实践是什么
  • 有没有办法避免用户总是“同意”(让他们实际点击universal/app链接)
  • 我还注意到Facebook将其应用程序本身用作一种授权服务器,因此当我在应用程序上点击“与Facebook一起登录”时,我会进入一个Facebook页面,询问我是否要“启动应用程序以执行登录”。我想知道我如何才能做到这一点,允许我的用户在手机上使用我的应用程序(如果安装了的话)登录SPA,就像facebook使用他们的应用程序一样
    这里的威胁来自于有人在他们的设备上安装了一个恶意应用程序,该应用程序实际上可能会模拟你的应用程序。PKCE阻止另一个应用拦截从您的应用启动的合法登录请求,因此标准方法尽可能安全。每次强制用户登录/同意应该有助于让他们注意到正在发生的事情


    从用户体验角度来看,我认为最大限度地减少使用基于浏览器的登录流的情况非常有意义。我会利用平台的安全功能(例如,iOS上的secure enclave),在用户以交互方式登录后,在其中保留一个刷新令牌,然后他们可以使用PIN、指纹或人脸等进行登录。

    我认为最好摆脱自定义身份验证系统,而是允许我的用户使用我的OpenID提供商,使用他们在SPA上使用的相同帐户登录。

    这是OAuth 2.0和OpenID Connect为您提供的。在不同服务之间使用单个用户标识的能力。所以这是正确的方法

    不再可能在客户端/第三方(本机应用程序)上存储任何类型的“机密”,因为它可能会被泄露

    对。从OAuth 2.0规范的角度来看,这些被称为。不建议将客户机密与之关联。相反,授权代码、应用程序ID和重定向URL用于验证身份提供程序中的令牌请求。这使得授权码成为一个有价值的秘密

    使用苹果通用链接和安卓应用程序链接,将一个域(比如app.example.com)与我的移动应用程序关联。

    不是移动专家。但是,自定义URL域是处理OAuth和OpenID Connect重定向的方法

    此外,使用PKCE也是正确的方法。因此,在浏览器(用户代理)中发生重定向时,可能会有恶意方获取授权代码。PKCE通过引入一个不会暴露给用户代理(浏览器)的秘密来避免这种情况。机密仅用于令牌请求(直接HTTP通信),因此是安全的

    Q1

    在PKCE中使用授权代码流是OAuth规范推荐的标准最佳实践。这对于OpenID Connect也是有效的(因此它构建在OAuth 2.0上)

    需要注意的一点是,若您相信PKCE机密可以被利用,那个么它实际上意味着设备被破坏了。考虑从操作系统内存中提取秘密。这意味着系统被破坏(病毒/键盘记录器或我们所说的)。在这种情况下,最终用户和您的应用程序有更多的事情需要担心

    此外,我相信这是一个商业应用程序。如果是这样的话,您的客户肯定会有他们设备的安全最佳实践指南。例如安装病毒防护和限制应用程序安装。为了防止上述袭击,我们将不得不依赖这些安全设施。OAuth2.0本身是不安全的。!这就是为什么会有最佳实践指南和政策

    Q2

    我对此不清楚。“同意”页面由身份提供程序显示。它会的