Oauth 2.0 公共客户端上的客户端身份验证

Oauth 2.0 公共客户端上的客户端身份验证,oauth-2.0,Oauth 2.0,通过研究OAuth2.0,我最终发现了以下两个参考文献: , 如果我错了,请纠正我: 使用未注册的客户端是可能的,但您必须自己管理它们,并承担安全风险 我应该如何管理它们 一些更具体的问题: 根据定义,不能安全地存储其凭据(客户端id+机密)。这是一个好主意吗?如果我不能使用机密验证/认证它,我还应该做什么 客户注册≠ 端点注册:第一个是关于注册客户端凭据(Client\u id+secret);第二个是关于注册。重定向端点注册是否足以授予客户端的真实性 是否使用相同的凭证(client\

通过研究OAuth2.0,我最终发现了以下两个参考文献: ,

如果我错了,请纠正我:

使用未注册的客户端是可能的,但您必须自己管理它们,并承担安全风险

  • 我应该如何管理它们
一些更具体的问题:

  • 根据定义,不能安全地存储其凭据(客户端id+机密)。这是一个好主意吗?如果我不能使用机密验证/认证它,我还应该做什么
  • 客户注册≠ 端点注册:第一个是关于注册客户端凭据(
    Client\u id+secret
    );第二个是关于注册。重定向端点注册是否足以授予客户端的真实性
  • 是否使用相同的凭证(
    client\u id+secret
    )进行客户端注册
  • 我想你可以通过解释它的意思来回答我

    请给我一些关于如何实现授权服务器和资源服务器之间交互的参考资料和实际示例


    谢谢

    tl;医生:

  • 无法使用
    client\u id
    client\u secret
    对本机客户端进行身份验证。如果需要对客户机进行身份验证,则必须实现一个身份验证方案,该方案不将共享机密委托给客户机(或让最终用户参与客户机身份验证讨论)。根据应用程序的安全模型,您可能不需要对客户端进行身份验证。
  • 重定向端点通常不足以对客户端进行身份验证。
  • 授权类型“客户端凭据”可以使用授权服务器支持的任何客户端身份验证机制,包括在客户端注册时提供的凭据。
  • 我读到的要点是,您可以信任机密客户的
    客户id
    (读:“用户名”)和
    客户机密
    (读:“密码”)通过您的服务对其进行身份验证。第三方应用程序不可能用该客户端的凭据来表示自己,因为它们被合理地假定为安全地存储在远离窥探者的地方

    然而,公共客户机无法做出这样的保证——无论是基于浏览器的应用程序还是本机桌面应用程序,客户机的id和机密都会分发给全世界。假设这样的应用程序最终会落入熟练的开发人员和黑客手中,他们可以挖掘客户机并提取id和秘密,这是非常合理的。因此,第10.1节明确规定:

    The authorization server MUST NOT issue client passwords or other
    client credentials to native application or user-agent-based
    application clients for the purpose of client authentication.
    
    好的。因此,公共客户端无法通过密码进行身份验证。然而

    The authorization server MAY issue a client password or other
    credentials for a specific installation of a native application
    client on a specific device.
    
    此异常之所以有效,是因为它将客户机的身份验证与特定设备联系在一起,这意味着即使有人拿走了客户机的秘密,他们也无法重用它。然而,这个例外隐含的含义是“特定设备上的特定安装”必须是唯一可识别的、难以欺骗的,并且是该客户端身份验证过程的一部分

    并不是每个本机应用程序都能满足这些标准,基于浏览器的应用程序当然不能,因为在它运行的环境中没有唯一可识别或难以欺骗的东西。这导致了两种选择——您可以将客户端视为未经身份验证的客户端,也可以提出更合适的身份验证机制

    身份验证舞蹈的关键是一个共享秘密——只有授权服务器和身份验证客户端才知道这个秘密对于公共客户,客户本身没有什么是秘密的。谢天谢地,这是有选择的,我不仅仅是在谈论RFID遥控钥匙和生物识别技术(尽管这些是完全可以接受的)

    作为一个思想实验,让我们考虑一个基于浏览器的客户端。我们可以合理地假设一些关于它的事情:它在浏览器中运行,它从特定的域提供服务,并且该域由客户端的作者控制。身份验证服务器应该已经有了一个客户端重定向URI,因此我们已经有了一些东西,但正如规范所指出的:

    A valid redirection URI is not sufficient to verify the client's
    identity when asking for resource owner authorization but can be
    used to prevent delivering credentials to a counterfeit client
    after obtaining resource owner authorization.
    
    因此,重定向URI是我们应该检查的,但不是我们可以信任的,这在很大程度上是因为域可能被欺骗。但是服务器本身不能,所以我们可以尝试询问域一些只有客户端域的服务器才知道的事情。实现这一点的最简单方法是,身份验证服务器需要第二个(“私有”)URI,该URI位于与客户端相同的域中,客户端的秘密将托管在该域中。当客户机应用程序发出授权请求时,服务器然后根据与客户机报告的主机名相关的第二个URI“签入”,并查找共享机密(该机密只应披露给授权服务器的IP地址)以对客户机进行身份验证

    当然,这不是一个完美的解决方案。它并不适用于所有应用程序,很容易出错,而且可能需要大量的工作来实现。存在许多潜在的身份验证机制(高度特定和高度通用),任何不将私有数据委托给客户机应用程序的机制都适用于这个问题空间

    我们的另一个选择是不实现进一步的身份验证,并将客户端视为未经身份验证的客户端。这与未注册的客户端明显不同,但差别很小。未注册的客户端是身份未知的客户端。未经身份验证的客户端是身份已知但不受信任的客户端。这两种类型的客户机的安全含义是相同的:都不应将私有数据委托给它们。授权是否为ser
    The authorization server is encouraged to consider stronger
    authentication means than a client password.