Merge pull request #23045 from backstage/freben/graphs
bep-0003: illustrate with some sequence diagrams
This commit is contained in:
@@ -425,6 +425,79 @@ backend:
|
||||
|
||||
The exact impact that this has is that it disables the check in the `HttpRouterService` implementation, effectively applying the `unauthenticated` access level to all routes. Furthermore, it will also change `AuthService` so that the `getPluginRequestToken()` method will now issue an empty token for a `'none'` principal, rather than throwing.
|
||||
|
||||
### Token Details
|
||||
|
||||
Note that this section is NOT normative. It illustrates the token shapes and major token flows that are involved in this proposal, but intentionally leaves out some low level details and is subject to change.
|
||||
|
||||
#### Backstage Identity Tokens
|
||||
|
||||
These are the regular tokens, commonly in short referred to just as "Backstage Tokens", that the auth backend generates for the user during sign-in. These are sent along with calls to backend plugins to identify the user. This BEP does not aim to change the shape of these tokens; this section is only here for informative purposes to convey what pieces of information that are at play.
|
||||
|
||||
This is a JWT token.
|
||||
|
||||
```yaml
|
||||
# Header
|
||||
{
|
||||
"alg": "ES256",
|
||||
"kid": "4f5a0543-894a-4176-b0b7-699a7026b72f"
|
||||
}
|
||||
# Payload
|
||||
{
|
||||
"iss": "http://localhost:7007/api/auth",
|
||||
"sub": "user:default/example-user",
|
||||
"ent": ["user:default/example-user", "group:default/my-team"],
|
||||
"aud": "backstage",
|
||||
"iat": 1708333140,
|
||||
"exp": 1708336740
|
||||
}
|
||||
```
|
||||
|
||||
The key ID is some random UUID. The `iss` (issuer) is the external base URL of your auth backend. Note that it uses the `ES256` asymmetric signature algorithm, and the auth backend exposes a JWKS that contains the public parts of the signing keys. The `sub` is an entity ref denoting who the signed in user is, and the `ent` is an array of entity refs that they claim ownership through. The `aud` (audience) is hardcoded to the string `"backstage"` always.
|
||||
|
||||
#### Legacy Service Tokens
|
||||
|
||||
These are the tokens that have been used for backend-to-backend communications before this BEP, and they will likely have changes as part of this work.
|
||||
|
||||
This is a JWT token.
|
||||
|
||||
```yaml
|
||||
# Header
|
||||
{
|
||||
"alg": "HS256"
|
||||
}
|
||||
# Payload
|
||||
{
|
||||
"sub": "backstage-server",
|
||||
"exp": 1708337056
|
||||
}
|
||||
```
|
||||
|
||||
Note that unlike the identity token in the previous section, it uses the `HS256` symmetric signature algorithm. The key used is the first of the `backend.auth.keys` entries in your `app-config`, which is a shared secret among all backend plugins, enabling them to know that the caller is a legitimate one. But the token does not contain any information about who the caller is (it's just a generic `"backstage-server"`), nor who the receiver (audience) is.
|
||||
|
||||
#### New Cookie Token Flow
|
||||
|
||||
Some plugins serve static content that the browser engine requests directly, e.g. the TechDocs plugin. Those calls cannot easily have a bearer token attached to them. For these use cases a cookie based flow will be used instead.
|
||||
|
||||

|
||||
|
||||
The frontend part of the plugin ensures that a cookie endpoint on the backend part of the plugin is called before attempting to render static content. This endpoint validates the user's identity token and sets a corresponding cookie on the response. Subsequent requests for getting static content will automatically have this cookie attached to them by the browser.
|
||||
|
||||
We intentionally do not specify here how the cookie token is acquired. It might be issued by the plugin itself or by the auth backend depending on how the architecture evolves, but this does not have any effect on plugin code.
|
||||
|
||||
The cookie token contains the user's identifying information just like the identity cookie but is severely limited. It has the plugin itself specified as its audience. Thus, this token is not usable in any bearer token context, nor as a cookie toward any other plugin.
|
||||
|
||||
#### New Service OBO Token Flow
|
||||
|
||||
When a backend service needs to in turn make a request to another upstream service to fulfil the original request, it uses an On-Behalf-Of (OBO) token for the purpose.
|
||||
|
||||

|
||||
|
||||
The initial request in this picture is a frontend plugin, but the same concept applies if it is initiated by a service. The scaffolder backend in this example acquires an OBO token to be able to talk to the catalog plugin.
|
||||
|
||||
We intentionally do not specify here how the OBO token is acquired. It might be issued by the plugin itself or by the auth backend depending on how the architecture evolves, but this does not have any effect on plugin code.
|
||||
|
||||
The OBO token specifies the target service as its audience and itself as the subject, but additionally also contains the original caller's identifying information. Thus, the target service can identify who the nearest caller is but also apply permissions that are relevant to the original caller. The token is thus scoped to not be usable toward other backend plugins.
|
||||
|
||||
## Release Plan
|
||||
|
||||
The existing `IdentityService` and `TokenManagerService` will be deprecated and instead implemented in terms of the new `AuthService`.
|
||||
|
||||
@@ -0,0 +1,203 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="391px" height="261px" viewBox="-0.5 -0.5 391 261" content="<mxfile><diagram id="Wjgsm-kAhxxm43YMIDME" name="Page-1">5VrbcqM4EP0aP8YFyGD8OHbizEN2a2ozVbv7KIOwVZGRI+Qk3q/fFkjchG8xziQ1TNUUanSBc7qPuuUM0Gz9di/wZvUHjwkbeE78NkC3A88beS78rwy7wuAHQWFYChoXJrcyPNL/iDY62rqlMckaHSXnTNJN0xjxNCWRbNiwEPy12S3hrLnqBi/1ik5leIwwI1a3v2ksV/qzwlrv74QuV2ZlXz9Y4OhpKfg21csNPDTPr+LxGpupdP9shWP+WjOhuwGaCc5lcbd+mxGmkDWoFePme56Wry1IKk8ZgPxixAtmW/3pEedPlCjQGLxZ8ZZyZ4CBF96o2+2azQVew+30dUUledzgSNlfwR3AtpJrBi1XPdb4AXZgN6Ah1UooYzPOuMjnRkmSeFEE9kwK/kRqT+JgEfiBGsFTWbM7+QV2+7s1FC9ESPJWM2kc7glfEyl20EU/Ndxqj3UNRa8V/2iibas696Yj1j63LKeugIcbjX03D57Nw1R5MRGHGHigCWE0VSRsiKCwKlHAMG3+UdmOkQRxJDEMEWWbMbzJ6CJfVSEsSLQVGX0hf5GsCFdl5VupVpqVYdhBa4xJmHTSGkQhWSTXpdUNmrwGNq1hB6tlv0tYRSOLVYvOGgkbTlOZL+dPB/5ti1Uu5IoveYpZndd2CPnqn41ocXVykF+dWJdOeTLYRk401hMba7cD616gDo9DTWLQeN1MeR42NfQziYX8pvaO6vF+TDK+FRFp0gwTLEmrn1rzIHKCMCwhrJpb2CVIuBYSP0m0inmUDbyAwftNF6AqwVLdTWG/IrBZfX2R8UkYj7ocPPQWKLjy3oG8XygywZcWGXQ+2E2RcZ3TVGbUB9bjS1Vmr7P1JxT5UBAyvKt10LRXM/9QhgpUK/0JnBYwxYx7Rjt+5+hy+UIu9ah6PtqaCPlHJio01pooJ64E6yQuR7ZO3t/9HKhInpscuIPaB7yAUqfBKWZ0mcJ9BJzm8aJ8mUIx8U0/WNM4VnOAvoGs4Urv7GBUIaXLoVA353hNmcJjBiBSlRE6f5LX7mAy/tkOprJS0osP6uVGV5A5QxDHoMlF0TrPDy2Gb9xRY9Ybd9KcgidJRi4m17k0UAFTsftHNYYO8ozhX0XccDIZG8Ptm6ayaO3qrZqE5sYYZysSl/PHJtngG5IWljlVX3R7cFf6ZELhOecIRTu+zeizhQIUZ4i8pn9OJsMwvJpceJZH5W7qlPUyT3Pwsw1Ps8+gHbYHlVFxsTzcgD4Eo7AfRWi6xE27nu5HEM4rxdosLLiUfA0PmKJwWp7ymBxH60ctqCOGs4xGjbh22yJwlLHumG+WGmiPDtTzIbONXkgVhOsQoXDsTILxeOROINtrRHPY07YPEw1diOfyOimqL5ay8ICUvcfn7EOdhTnUAb8DIqIi8iTJX0uQ5y3Jijf+fNphAqiH1ML1fLeVBPSjJOOWkrRm6EdJ7Hqr3AIklD2pRV+uFHnMO8eL5BoR4yucpXXQZ+nNXubKDcQETKABP1Lnuj2UXiO79PpdYXfDD4TdPlfbFgJGY3h9Kne/If6jj8Pft6tUc4qnvhieJFifQwbPW/Wz0fQ7YS9E7QOVyRz34eh5SwWpZ62au/bB4AJnQJ1OajXje7oaC3xK8UrGfKDeqs6Z7ipr197GSKImy8BxaLp8yFu3XjPVWjAePaldruFwB0vntrvtcZ5aEejmJ1u1ItDzS8M5ReDhBHJPune6r6rEHDmjXrZTFLQOAManpXfn5mHlz2qtdfZmi+3+k7NK0CCAytHKLau5huZE9Ui6Wc3ca37h24WmFUqfpFJ5j59+QFXiNdPA8meo86uSydA/PNW1KpFDHv0en/o61e/X8Cn03nMr26esqa7kU+jQQd1xn4Jm9WcpRffqL3/Q3f8=</diagram></mxfile>" style="background-color: rgb(255, 255, 255);">
|
||||
<defs/>
|
||||
<g>
|
||||
<path d="M 0 60 L 80 60 L 80 75 L 70 90 L 0 90 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<path d="M 80 60 L 390 60 L 390 180 L 0 180 L 0 90" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 75px; margin-left: 1px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
cookie flow
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="40" y="79" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
cookie flow
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="80" y="0" width="80" height="40" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/>
|
||||
<path d="M 120 40 L 120 260" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 20px; margin-left: 81px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
Browser
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="120" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Browser
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="115" y="90" width="10" height="60" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
|
||||
<rect x="240" y="0" width="80" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
|
||||
<path d="M 280 40 L 280 260" fill="none" stroke="#82b366" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 20px; margin-left: 241px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
Techdocs
|
||||
<br/>
|
||||
Backend
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="280" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Techdocs...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="275" y="100" width="10" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
|
||||
<path d="M 125 100 L 190 100 Q 200 100 210 100 L 268.63 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 273.88 100 L 266.88 103.5 L 268.63 100 L 266.88 96.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 80px; margin-left: 186px;">
|
||||
<div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 8px; font-family: "Courier New"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">
|
||||
GET /cookie
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="186" y="83" fill="rgb(0, 0, 0)" font-family="Courier New" font-size="8px" text-anchor="middle">
|
||||
GET /cookie
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 275 140 L 210 140 Q 200 140 190 139.98 L 127.56 139.88" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
|
||||
<path d="M 133.44 136.39 L 126.44 139.88 L 133.43 143.39" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 120px; margin-left: 200px;">
|
||||
<div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">
|
||||
set cookie on response
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="200" y="123" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="8px" text-anchor="middle">
|
||||
set cookie on response
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 120.34 220 L 190 220 Q 200 220 210 220 L 273.13 220" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
|
||||
<path d="M 278.38 220 L 271.38 223.5 L 273.13 220 L 271.38 216.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 200px; margin-left: 203px;">
|
||||
<div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">
|
||||
browser static content requests
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="203" y="203" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="8px" text-anchor="middle">
|
||||
browser static content requests
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="160" y="207" width="80" height="10" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 212px; margin-left: 161px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 7px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
cookie token
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="200" y="214" fill="#000000" font-family="Helvetica" font-size="7px" text-anchor="middle">
|
||||
cookie token
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="160" y="127" width="80" height="10" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 132px; margin-left: 161px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 7px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
cookie token
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="200" y="134" fill="#000000" font-family="Helvetica" font-size="7px" text-anchor="middle">
|
||||
cookie token
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="160" y="87" width="80" height="10" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 92px; margin-left: 161px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 7px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
user identity token
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="200" y="94" fill="#000000" font-family="Helvetica" font-size="7px" text-anchor="middle">
|
||||
user identity token
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 286 110 L 310 110 L 310 130.4 L 294.45 130.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 287.45 130.36 L 294.45 126.87 L 294.44 133.87 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 119px; margin-left: 314px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: left;">
|
||||
<div style="display: inline-block; font-size: 7px; font-family: "Courier New"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">
|
||||
<font face="Helvetica">
|
||||
acquire cookie token
|
||||
<br/>
|
||||
based on user token
|
||||
<br/>
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="314" y="121" fill="#000000" font-family="Courier New" font-size="7px">
|
||||
acquire cookie token...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 120.34 230 L 190 230 Q 200 230 210 230 L 273.13 230" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
|
||||
<path d="M 278.38 230 L 271.38 233.5 L 273.13 230 L 271.38 226.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<path d="M 120.34 240 L 190 240 Q 200 240 210 240 L 273.13 240" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
|
||||
<path d="M 278.38 240 L 271.38 243.5 L 273.13 240 L 271.38 236.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
</g>
|
||||
<switch>
|
||||
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
|
||||
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||
Text is not SVG - cannot display
|
||||
</text>
|
||||
</a>
|
||||
</switch>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 18 KiB |
@@ -0,0 +1,203 @@
|
||||
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="401px" height="251px" viewBox="-0.5 -0.5 401 251" content="<mxfile><diagram id="Wjgsm-kAhxxm43YMIDME" name="Page-1">7VrbcuI4EP0aHkP5jnkcIGQeMrupzVbt7qOwhVFFWIwsh7Bfvy1bvsgywSQwyWyNU5Wy2rrY3eecbikZufPtyx1Hu803FmM6cqz4ZeQuRo7jOTb8loZDafCDoDQknMSlyW4Mj+RfrIyWsuYkxpnWUTBGBdnpxoilKY6EZkOcs73ebc2ovuoOJWpFqzE8Rohio9tfJBYb9Vlhq/dXTJJNtbKvHqxQ9JRwlqdquZHjrourfLxF1VSqf7ZBMdu3TO7tyJ1zxkR5t32ZYyo9W3mtHLc88rR+bY5TMWSA45cjnhHN1afPpPcwV+8nDpVL4FV38jbf0nuyxpSk0JrtMCdbLKC/u6DK/NDYZvsNEfhxhyI5dA9YAdtGbCm0bLiF+AkEQ3jdphTtMrIqVrXAwnGU84w84z9wVsJEWlku5ErzOvzSuCaUzhllvHhhN0Y4XEdgzwRnT7j1JIhCvFrLEbB8y24VF9hNNyrPPmMu8EvLpNx6hxl8MT9Al+ppoEKsGFA19w2cKjRtWkhyKiQhheCknrkJI9yoSPZH1fWMqBrhbAVhx0gqiuX82chfdKLKuNiwhKWItuPa8fXalz+mR8urNwbF1evrGpSDne36mq+npq/tHl/b3iV8bRu+Bh1ZS8WRJAooLDZbybtE3s1AIDCow8/PLh+HsdcX2dBZuUVkr8gu1/lAdgU/Nbvc852ts8u2BtLLuYCzA7fH2SWppDNkbi/RD9bvuUybs6+YPmNBItSYKvah6HtOOJaxwvyZRPKOrVhRXQAtTbquUIZj2QmeWXmRFo91rSzwReWbVeYONHAMlYZqNtG/baxtBiNKklSSH6/lZBlQnaTJfdFaQMhmoCVfZL0DzRVl0ZPktCw/cFzRFt5libaEyujNWc5J8RG/4b16qIqvySuEBezww9/ylcZ2gbfC8I9cYez4tWHxotYsW4d2q4XuwkjRCtNZXS1Vq6as0L3SadJTegmIeIIrGAfHoH0UxzfW2HItlRs5pkiA8OmlYw9S1XQPksbNXF6gc8LuYD0DT0dYDWrgDrFCh1Y3JQ5Hl5lYvcssB3Z3te5wU67fPzjoH1y/a+l945OaeaqObL3OsBh1WV4HZJjKTk6rbJtKCjkt7hxNM2Vs9FKpD1od/Jm4Og9D58a+zmBVQIJXovkGD3tm5fLw++OfIynbS4Gyp6zX4feSuf0qFYGni/wlcwsIMP2iHmxJHBfSxmWZgZr6w0yOLUkKCzET4GKWDlGzHkGoQNTNdfXOUb3LqL396tMOkA7L6nD+IkJyY3varDf2VJ/iImyqKt23s6mVA6xuDgjDN+WAGGWbIk/ZeiJjO8ivhWVJ5BctXi0afxhLj6qu6+shrIl7IhmYjLf8savSbnF15p1Mx9PAfHxCoN8CF8eAS5ZHEc4+gySYSKjR/W6ayxIh8MILMVsn9lV4be5F5kggypJfW8/jW88enBjCchQiXvhxW09vQFH0ybaeJ3xdAnjw1nMybOt5iYOdSgXeW4Aau5gBULtuYel5OoKds7YJbuD3jj472/n2iYkumM+mRizvblWlC7EggmDw13I8Hn+C/Dagxh2c6DpkC18l2+Vr3LqmDa+Q+3yzSDmToFpN6+g17XQ6+UE17ScUCHc6DkKdnJNzNMK3PZigKVTt3rnOVgyQnrHVvnSwOsF0HPrX0hDfPIkUeLuDOMhTxEJFDp9APd4lECWl/jfVsW+mcHWGS+IqYNVxbidw+iHqiWK3e4x64b9DvqtcdTrJ3q62DCfq1e6B5ltKKN9Mu0fO3a/o/Y/dLFidUsueXMv70Gz+b6AkS/OvGe7tfw==</diagram></mxfile>" style="background-color: rgb(255, 255, 255);">
|
||||
<defs/>
|
||||
<g>
|
||||
<rect x="0" y="0" width="80" height="40" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/>
|
||||
<path d="M 40 40 L 40 250" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 20px; margin-left: 1px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
Browser
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="40" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Browser
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="35" y="90" width="10" height="140" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
|
||||
<rect x="160" y="0" width="80" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
|
||||
<path d="M 200 40 L 200 250" fill="none" stroke="#82b366" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 20px; margin-left: 161px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
Scaffolder
|
||||
<br/>
|
||||
Backend
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="200" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Scaffolder...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="195" y="100" width="10" height="120" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
|
||||
<path d="M 206 110 L 230 110 L 230 130.4 L 214.45 130.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 207.45 130.36 L 214.45 126.87 L 214.44 133.87 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 119px; margin-left: 234px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: left;">
|
||||
<div style="display: inline-block; font-size: 7px; font-family: "Courier New"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">
|
||||
<font face="Helvetica">
|
||||
acquire service obo token
|
||||
<br/>
|
||||
based on user token
|
||||
<br/>
|
||||
</font>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="234" y="121" fill="#000000" font-family="Courier New" font-size="7px">
|
||||
acquire service obo token...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 45 100 L 110 100 Q 120 100 130 100 L 188.63 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 193.88 100 L 186.88 103.5 L 188.63 100 L 186.88 96.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 80px; margin-left: 106px;">
|
||||
<div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 8px; font-family: "Courier New"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">
|
||||
POST /tasks
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="106" y="83" fill="rgb(0, 0, 0)" font-family="Courier New" font-size="8px" text-anchor="middle">
|
||||
POST /tasks
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 194 220 L 47.57 219.96" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
|
||||
<path d="M 53.45 216.46 L 46.45 219.96 L 53.45 223.46" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 211px; margin-left: 124px;">
|
||||
<div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">
|
||||
success
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="124" y="214" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="8px" text-anchor="middle">
|
||||
success
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="320" y="0" width="80" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
|
||||
<path d="M 360 40 L 360 250" fill="none" stroke="#82b366" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 20px; margin-left: 321px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
Catalog
|
||||
<br/>
|
||||
Backend
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="360" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
|
||||
Catalog...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="355" y="170" width="10" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
|
||||
<path d="M 205 170 L 270 170 Q 280 170 290 170 L 348.63 170" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
|
||||
<path d="M 353.88 170 L 346.88 173.5 L 348.63 170 L 346.88 166.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 151px; margin-left: 280px;">
|
||||
<div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 8px; font-family: "Courier New"; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">
|
||||
GET /entities/...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="280" y="154" fill="rgb(0, 0, 0)" font-family="Courier New" font-size="8px" text-anchor="middle">
|
||||
GET /entities/...
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<path d="M 354.68 210 L 289.68 210 Q 279.68 210 269.68 209.98 L 207.24 209.85" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
|
||||
<path d="M 213.13 206.37 L 206.12 209.85 L 213.11 213.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 201px; margin-left: 284px;">
|
||||
<div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 8px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">
|
||||
template entity
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="284" y="204" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="8px" text-anchor="middle">
|
||||
template entity
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="80" y="86" width="80" height="10" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 91px; margin-left: 81px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 7px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
user identity token
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="120" y="93" fill="#000000" font-family="Helvetica" font-size="7px" text-anchor="middle">
|
||||
user identity token
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
<rect x="240" y="157" width="80" height="10" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
|
||||
<g transform="translate(-0.5 -0.5)">
|
||||
<switch>
|
||||
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
|
||||
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 162px; margin-left: 241px;">
|
||||
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
|
||||
<div style="display: inline-block; font-size: 7px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
|
||||
service obo token
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="280" y="164" fill="#000000" font-family="Helvetica" font-size="7px" text-anchor="middle">
|
||||
service obo token
|
||||
</text>
|
||||
</switch>
|
||||
</g>
|
||||
</g>
|
||||
<switch>
|
||||
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
|
||||
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
|
||||
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
|
||||
Text is not SVG - cannot display
|
||||
</text>
|
||||
</a>
|
||||
</switch>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 18 KiB |
Reference in New Issue
Block a user