该Applications
表包含允许使用您的身份服务器的OAuth2 客户端应用程序。
使用授权码或隐式等交互式流程时,必须添加新条目,因为客户端应用程序必须发送有效的:如果缺少授权请求或与您完全信任的应用程序不对应(即应用程序),client_id
OpenIddict 将拒绝授权请求client_id
存储在Applications
表中)。
相同的规则适用于客户端凭据授予,这也需要有效的client_id
.
相比之下,在一种情况下,发送 aclient_id
不是强制性的:使用资源所有者密码凭证 grant时,如您提到的博客文章中所示。
规范明确指出发出令牌请求的客户端应用程序可以发送它的,client_id
这意味着该参数不是强制性的。
客户端可以在向令牌端点发送请求时使用“client_id”请求参数来标识自己。
当无法client_id
从token请求中提取出no时,OpenIddict就无法确定应用程序的身份。在这种情况下,将client_id
跳过 - 相关检查,并且在不使用Applications
表的情况下处理请求。这就是您的应用程序无需填充Applications
表格即可工作的原因。
虽然对日志记录有用,但发送 aclient_id
并不会使grant_type=password
请求更安全,因为每个人都可以通过重复使用相同的应用程序来模拟应用程序client_id
,除非应用程序被声明为机密并分配了客户端凭据(阅读“仅限服务器端应用程序”) . 在这种情况下,恶意调用者无法在不知道client_secret
.
在 OpenIddict 中,还有一种情况是添加显式应用注册很有用:使用自省中间件(而不是 JWT 承载中间件)验证访问令牌时。
按照规范的要求,调用者必须通过身份验证才能使用自省端点:如果 OpenIddict 在表中找不到相应的条目Applications
,则请求将被拒绝,自省中间件将永远无法工作。