当前位置: 首页 > 知识库问答 >
问题:

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

闽承望
2023-03-14
  • 应如何管理它们?

一些更具体的问题:

  1. 根据定义,本机应用程序(实际上是公共客户端)不能安全地存储其凭据(client_id+secret)。是未注册的客户吗?如果我不能使用秘密来验证/验证它,我还应该做什么?
  2. 客户端注册≠endpoint注册:第一个是关于注册客户端凭据(client_id+secret);第二个关于注册客户端重定向endpoint。重定向endpoint注册是否足以授予客户端的真实性?
  3. 客户端凭据授予是否使用相同的凭据(client_id+secret)进行客户端注册?

共有1个答案

东方方伟
2023-03-14

TL;DR:

    无法使用 client_idclient_secret对本机客户端进行身份验证。如果需要对客户机进行身份验证,则必须实现一个身份验证方案,该方案不将共享秘密委托给客户机(或者在客户机身份验证讨论中涉及最终用户)。根据应用程序的安全模型,您可能不需要对客户端进行身份验证。
  1. 重定向终结点通常不足以对客户端进行身份验证(尽管存在异常)。
  2. “客户端凭据”授权类型可以使用授权服务器支持的任何客户端身份验证机制,包括在客户端注册时提供的凭据。

我读到的要点是,您可以信任机密客户机的client_id(读:“username”)和client_secret(读:“password”)来用您的服务对它们进行身份验证。第三方应用程序不可能用该客户机的凭据来表示自己,因为它们被合理地假定是安全地存储在远离窥探的地方。

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.

然而,实用主义可能会胜出-- 一个未经身份验证的客户机从根本上来说,与您的浏览器无法验证站点SSL证书的真实性时偶尔会看到的SSL“错误”没有什么不同。浏览器将立即拒绝进行任何进一步的操作,并确切地报告原因,但允许用户通过担保服务器的身份来自己接受风险。类似的工作流可能对许多OAuth2应用程序都有意义。

为什么验证客户的身份很重要?不这样做,信任链就断了。您的应用程序的用户信任您的应用程序。授权工作流确定您的用户也信任客户端,因此您的应用程序应该信任客户端。无需验证客户端标识,另一个客户端就可以承担受信任客户端的角色,并拥有其所有的安全权限。关于客户端身份验证的一切都是为了防止这种违反信任的行为。

希望这能帮上忙!

The authorization server is encouraged to consider stronger
authentication means than a client password.
 类似资料:
  • 授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用

  • 在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3节所述与授权服务器进行身份验证。客户端身份验证用于: 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销

  • 如果客户端类型是机密的,客户端和授权服务器建立适合于授权服务器的安全性要求的客户端身份验证方法。授权服务器可以接受符合其安全要求的任何形式的客户端身份验证。 机密客户端通常颁发(或建立)一组客户端凭据用于与授权服务器进行身份验证(例如,密码、公/私钥对)。授权服务器可以与公共客户端建立客户端身份验证方法。然而,授权服务器不能依靠公共客户端身份验证达到识别客户端的目的。 客户端在每次请求中不能使用一

  • 有时需要对某些网络资源(如Servlet、JSP等)进行访问权限验证,也就是说,有访问权限的用户才能访问该网络资源。进行访问权限验证的方法很多,但通过HTTP响应消息头的WWW-Authenticate字段进行访问权限的验证应该是众多权限验证方法中比较简单的一个。 通过HTTP响应消息头的WWW-Authenticate字段可以使浏览器出现一个验证对话框,访问者需要在这个对话框中输入用户名和密码,

  • 我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。 因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证 在握手期间,客户端会出示其证书并进行身份验证,因为服务

  • 我正在组装一个soap客户端来调用第三方soap服务。我在连接Java时遇到问题。它在SoapUI上运行良好。这是我第一次在应用程序中设置密钥库。我发现的所有代码都是相同的,非常简单,但我不明白为什么java版本不起作用。。我使用的是该公司提供的TLS pfx文件,我也在尝试连接该公司的服务。我要从服务器上拿回403。。这是密码 非常感谢任何对我错误的帮助... 不确定是否重要,但服务器是一个.