Class ClientCredentialsService
M2M 憑證發放 capability——登入引擎的第四操作(ADR-025)
client_credentials grant(RFC 6749 §4.4):
機器客戶端以 client_id/client_secret 換取短效 access token。與 LoginService 的
login/refresh/logout 並列,共用全部下層——主體查找、資格判定、租戶探詢、token 簽發。
與登入的三個刻意差異:
| 面向 | 登入 | 本操作 |
|---|---|---|
| 資格判定 | 主體必須可互動登入 | 主體必須不可(AuthPrincipal.interactiveLoginAllowed() 反向) |
| refresh token | 發 | 不發(RFC 6749 §4.4.3 SHOULD NOT) |
| sessionId/黑名單 | 有 | 無——撤銷靠短效期與停用主體(M2M 無「登出」語意) |
憑證比對委派 AuthenticationManager(決策四):因而自動取得認證事件與統一稽核,
且引擎不需要碰 PasswordEncoder。用哪個 manager 由消費端組裝決定——登入鎖定是否
套用於 M2M 是產品決策(鎖定服務帳號可能被外部誤用觸發、造成整合中斷),框架不預設。
線格式歸 capability(決策二):請求解析與 client 認證方式見 ClientCredentialsRequest,
錯誤碼與狀態見 OAuth2TokenException,回應見 ClientCredentialsTokenResponse。消費端的殼
只負責把參數交進來、選擇錯誤序列化的方言。
組合:jar 不做 autoconfiguration(ADR-014),由消費端組態以 @Bean 建立。
未提供限流器時建構期發 WARN——公開端點無限流即為雜湊 CPU 的耗盡面,
不讓「忘了接」變成靜默失去保護。
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final record發放結果(引擎級——wire 回應由ClientCredentialsTokenResponse.bearer(String, long)組裝) -
Constructor Summary
ConstructorsConstructorDescriptionClientCredentialsService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, long tokenTtlMs, Optional<ClientCredentialsRateLimiter> rateLimiter, boolean requireTenant) 建構子(全部參數皆可由 Spring 建構子注入解析) -
Method Summary
-
Constructor Details
-
ClientCredentialsService
public ClientCredentialsService(org.springframework.security.authentication.AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, AuthPrincipalLookup principalLookup, long tokenTtlMs, Optional<ClientCredentialsRateLimiter> rateLimiter, boolean requireTenant) 建構子(全部參數皆可由 Spring 建構子注入解析)- Parameters:
authenticationManager- 憑證比對(消費端組裝;是否含登入鎖定由其決定)jwtTokenProvider- token 簽發principalLookup- 主體查找 SPItokenTtlMs- access token 有效期(毫秒)rateLimiter- 速率限制;empty = 不限流(會發 WARN,見下)requireTenant- 是否要求主體必帶租戶(租戶隔離部署應為 true)
-
-
Method Details
-
issue
發放 M2M token
序:參數驗證 → scope 拒絕 → 限流 → 憑證比對 → 非互動資格 → 租戶要求 → 簽發。 限流置於憑證比對之前(保護雜湊 CPU);憑證失敗保留原始型別與原因,線層仍使用 RFC 6749
invalid_client,揭露程度由 response policy 決定。- Parameters:
request- 已解析的請求(見ClientCredentialsRequest.of(Map, String))- Throws:
OAuth2TokenException- 依 RFC 6749 §5.2 的錯誤碼與狀態
-