|
| 1 | +--- |
| 2 | +'@objectstack/spec': minor |
| 3 | +'@objectstack/service-automation': minor |
| 4 | +'@objectstack/connector-rest': minor |
| 5 | +'@objectstack/connector-openapi': minor |
| 6 | +--- |
| 7 | + |
| 8 | +feat(spec): `signed` joins declarative connector-instance auth, with `aliyun-acs3-hmac-sha256` as its first scheme (ADR-0143 D2.3, #26710) |
| 9 | + |
| 10 | +Clause-②: yes (widening) |
| 11 | +Metadata-protocol: added |
| 12 | + |
| 13 | +<!-- adr-0087: not-required (no-migration-prescription) One member is added to the instance-auth union and optional members to the provider context and materialization. Nothing an author or a provider wrote before is refused or re-shaped, so there is nothing for a migration to rewrite. --> |
| 14 | + |
| 15 | +An upstream that authenticates every request by a signature over the request itself, rather than by a token it is sent, had no way to be declared on a connector instance. ADR-0143 D2.3 adds that kind, `signed`, with a closed list of schemes. A scheme joins the list only together with its signer and its vendor test vectors. This release ships one scheme: Alibaba Cloud's OpenAPI V3 signature. |
| 16 | + |
| 17 | +- **`@objectstack/spec`** |
| 18 | + - `ConnectorInstanceAuthSchema` gains `{ type: 'signed', scheme, keyId, credentialRef }`, a closed shape for each scheme. `keyId` is the public key identifier. The signing key is only ever a `credentialRef`. |
| 19 | + - The publish door refuses an unknown or missing `scheme` at `auth.scheme`, naming the value it got and the schemes that ship. It refuses an inline `secret`, `privateKey`, `secretKey` or `accessKeySecret` by name, with the `credentialRef` prescription, and an authored `signature`. It refuses `signed` on `provider: 'mcp'` at `auth.type`. |
| 20 | + - `@objectstack/spec/integration` gains the request-signer seam: `ConnectorRequestSigner` (`sign`, plus an optional `verifyResponse` for schemes that sign their responses), `ConnectorProviderContext.requestSigner`, and `ConnectorMaterialization.requestSignerApplied`. |
| 21 | + - `connectorFetchOptions` takes an optional signer and signs every attempt `resilientFetch` makes, retries included. `readConnectorResponse` runs the scheme's response verification before parsing. |
| 22 | + - With no signer, both behave exactly as before. |
| 23 | +- **`@objectstack/service-automation`** |
| 24 | + - A `signed` instance's key resolves through the same credential chain as the static kinds, with the same degrade on an unresolved reference. |
| 25 | + - The key is bound to the scheme's signer at materialization, and the provider receives only the signer. |
| 26 | + - The service refuses to serve a `signed` instance on a provider that does not acknowledge the signer, so such an instance never calls its upstream unsigned. |
| 27 | + - A datasource that borrows a `signed` instance through `external.connector` is refused with `422`. |
| 28 | +- **`@objectstack/connector-rest`, `@objectstack/connector-openapi`** |
| 29 | + - Both apply a handed request signer to every request and acknowledge it. |
| 30 | + - A static credential together with a signer is refused. |
| 31 | + - `bearer`, `api-key` and `basic` requests are unchanged. |
0 commit comments