【问题标题】:OAuth 2.0 Client Identity for Mobile Native App and pure JS client移动本机应用程序和纯 JS 客户端的 OAuth 2.0 客户端身份
【发布时间】:2020-09-29 03:58:49
【问题描述】:

我正在重新安装 OAuth 文档并了解 https://auth0.com/docs/flows/authorization-code-flow-with-proof-key-for-code-exchange-pkce 比授权代码流更好,因为它不太可能获取客户端代码并将其交换为 access_token

我还看到互联网上的某些情况下,客户端机密从 facebook 或 twitter 等大型移动应用程序中被逆转

所以对我来说,仍然不清楚如何正确实施客户身份 例如如果我使用资源所有者授权类型,我的应用程序中存储了客户端 ID 和客户端密码,这可以进行逆向工程,任何人都可以构建与我相同的应用程序

如果我使用 Authorization Code Flow with Proof Key for Code Exchange,我的应用程序中仍然没有任何秘密。因此,这意味着任何开发人员都可以构建自己的应用程序,作为我的应用程序的镜像。

那么问题是是否有任何方法可以为移动应用程序和纯 JS(浏览器)客户端正确实现客户端身份?

更新 有 2 个不错的选择 1 - 使用重定向网址 2 - 设置 CORS

1 但是我认为如果我尝试用后端代码模仿行为将无济于事。例如。我真的不需要访问网站就可以看到它在某些时候会在标头中提供重定向,我只是收到消息并拥有此授权码 2 对于我的镜像站点,CORS 也是如此,我将从后端获取令牌,服务器将无法识别客户端不是原始客户端并且有权使用此客户端

【问题讨论】:

    标签: oauth-2.0 oauth identityserver4 identityserver3


    【解决方案1】:

    那么问题是,是否有任何方法可以为移动应用程序和纯 JS(浏览器)客户端正确实现客户端身份?

    根据spec,授权代码流必须进行客户端身份验证。 redirection URI 是帮助客户端身份验证的建议解决方案。
    以下是 IDS4 上帮助验证客户端的选项:

    1. 在客户端配置上使用RedirectUris 来指定允许的URI 以返回令牌或授权代码。 Ref
    2. 使用CORS。浏览器的同源策略阻止从不同源读取资源。我们可以将我们的客户端添加到允许的跨域调用列表中。

    代码示例:

    new Client
    {
        ClientId = "js",
        ClientName = "JavaScript Client",
        AllowedGrantTypes = GrantTypes.Code,
        RequireClientSecret = false,
        RedirectUris = { "https://localhost:5003/callback.html" },
        PostLogoutRedirectUris = { "https://localhost:5003/index.html" },
        AllowedCorsOrigins = { "https://localhost:5003" },
        AllowedScopes =
        {
            IdentityServerConstants.StandardScopes.OpenId,
            IdentityServerConstants.StandardScopes.Profile
        }
    }
    
    

    【讨论】:

    • 感谢您的回复。 AllowedCorsOrigins = { "localhost:5003" },正是我想要的。
    • RedirectUris 我知道这个概念,并且很长时间以来一直认为这是一个解决方案。但是后来我意识到,为了获得令牌,您实际上并不需要欠该站点,因此您只需检查流量,并且在重定向 url 的响应中您只需看到代码。所以这意味着理论上你可以在没有权限重定向 url 的情况下进行牛排(类似于我做的邮递员)
    • 据我所知,这个概念适用于移动设备。但在这种情况下,您将重定向到浏览器并将登录名和密码放在那里。只是想知道如果我在移动应用程序中有自己的登录屏幕并想使用它,最好使用什么流程,并且尽量不要将客户端密码存储在移动设备的某个地方,有没有好的方法来解决这个问题?
    • 你说的叫code substitution attack。 PKCE 是一种缓解它的解决方案。简而言之,拥有客户端身份验证(clientId + Redirect URL + CORS)+ PKCE 使得破解变得更加困难。因为涉及多项检查和随机生成的值。中间人应该坐在用户的机器上并进行网络钓鱼以取得成功。阅读更多docs.identityserver.io/en/latest/topics/…
    • PKCE 是他对原生应用程序的官方推荐(参考:tools.ietf.org/html/rfc8252#section-6
    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多