@backstage/plugin-auth 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @backstage/plugin-auth
|
|
2
2
|
|
|
3
|
+
## 0.1.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 1609e79: Authentication content screen now uses application title.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/frontend-plugin-api@0.13.0
|
|
10
|
+
- @backstage/core-components@0.18.3
|
|
11
|
+
|
|
12
|
+
## 0.1.2-next.0
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 1609e79: Authentication content screen now uses application title.
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
- @backstage/core-components@0.18.3-next.0
|
|
19
|
+
- @backstage/frontend-plugin-api@0.12.2-next.0
|
|
20
|
+
- @backstage/errors@1.2.7
|
|
21
|
+
- @backstage/theme@0.7.0
|
|
22
|
+
|
|
3
23
|
## 0.1.1
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
|
@@ -8,6 +8,7 @@ import AppsIcon from '@material-ui/icons/Apps';
|
|
|
8
8
|
import WarningIcon from '@material-ui/icons/Warning';
|
|
9
9
|
import { EmptyState, Progress, ResponseErrorPanel, Page, Header, Content } from '@backstage/core-components';
|
|
10
10
|
import { useConsentSession } from './useConsentSession.esm.js';
|
|
11
|
+
import { useApi, configApiRef } from '@backstage/frontend-plugin-api';
|
|
11
12
|
|
|
12
13
|
const useStyles = makeStyles((theme) => ({
|
|
13
14
|
authCard: {
|
|
@@ -62,6 +63,8 @@ const ConsentPage = () => {
|
|
|
62
63
|
const classes = useStyles();
|
|
63
64
|
const { sessionId } = useParams();
|
|
64
65
|
const { state, handleAction } = useConsentSession({ sessionId });
|
|
66
|
+
const configApi = useApi(configApiRef);
|
|
67
|
+
const appTitle = configApi.getOptionalString("app.title") ?? "Backstage";
|
|
65
68
|
if (!sessionId) {
|
|
66
69
|
return /* @__PURE__ */ jsx(ConsentPageLayout, { title: "Authorization Error", children: /* @__PURE__ */ jsx(
|
|
67
70
|
EmptyState,
|
|
@@ -101,7 +104,7 @@ const ConsentPage = () => {
|
|
|
101
104
|
}
|
|
102
105
|
),
|
|
103
106
|
/* @__PURE__ */ jsx(Typography, { variant: "h5", gutterBottom: true, children: state.action === "approve" ? "Authorization Approved" : "Authorization Denied" }),
|
|
104
|
-
/* @__PURE__ */ jsx(Typography, { variant: "body1", color: "textSecondary", gutterBottom: true, children: state.action === "approve" ?
|
|
107
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body1", color: "textSecondary", gutterBottom: true, children: state.action === "approve" ? `You have successfully authorized the application to access your ${appTitle} account.` : `You have denied the application access to your ${appTitle} account.` }),
|
|
105
108
|
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "Redirecting to the application..." })
|
|
106
109
|
] }) }) }) });
|
|
107
110
|
}
|
|
@@ -114,7 +117,11 @@ const ConsentPage = () => {
|
|
|
114
117
|
/* @__PURE__ */ jsx(AppsIcon, { className: classes.appIcon }),
|
|
115
118
|
/* @__PURE__ */ jsxs(Box, { children: [
|
|
116
119
|
/* @__PURE__ */ jsx(Typography, { className: classes.appName, children: appName }),
|
|
117
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", children: [
|
|
121
|
+
"wants to access your ",
|
|
122
|
+
appTitle,
|
|
123
|
+
" account"
|
|
124
|
+
] })
|
|
118
125
|
] })
|
|
119
126
|
] }),
|
|
120
127
|
/* @__PURE__ */ jsx(Divider, {}),
|
|
@@ -127,7 +134,9 @@ const ConsentPage = () => {
|
|
|
127
134
|
children: [
|
|
128
135
|
/* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
|
|
129
136
|
/* @__PURE__ */ jsx("strong", { children: "Security Notice:" }),
|
|
130
|
-
" By authorizing this application, you are granting it access to your
|
|
137
|
+
" By authorizing this application, you are granting it access to your ",
|
|
138
|
+
appTitle,
|
|
139
|
+
" account. The application will receive an access token that allows it to act on your behalf."
|
|
131
140
|
] }),
|
|
132
141
|
/* @__PURE__ */ jsxs(Box, { mt: 1, children: [
|
|
133
142
|
/* @__PURE__ */ jsx(Typography, { variant: "body2", children: /* @__PURE__ */ jsx("strong", { children: "Callback URL:" }) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsentPage.esm.js","sources":["../../../src/components/ConsentPage/ConsentPage.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useParams } from 'react-router-dom';\n\nimport {\n Box,\n Button,\n Card,\n CardContent,\n CardActions,\n Typography,\n makeStyles,\n Divider,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport AppsIcon from '@material-ui/icons/Apps';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport {\n Header,\n Page,\n Content,\n Progress,\n EmptyState,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { useConsentSession } from './useConsentSession';\n\nconst useStyles = makeStyles(theme => ({\n authCard: {\n maxWidth: 600,\n margin: '0 auto',\n marginTop: theme.spacing(4),\n },\n appHeader: {\n display: 'flex',\n alignItems: 'center',\n marginBottom: theme.spacing(2),\n },\n appIcon: {\n marginRight: theme.spacing(2),\n fontSize: 40,\n },\n appName: {\n fontSize: '1.5rem',\n fontWeight: 'bold',\n },\n securityWarning: {\n margin: theme.spacing(2, 0),\n },\n buttonContainer: {\n display: 'flex',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n padding: theme.spacing(2),\n },\n callbackUrl: {\n fontFamily: 'monospace',\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n wordBreak: 'break-all',\n fontSize: '0.875rem',\n },\n scopeList: {\n backgroundColor: theme.palette.background.default,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(1),\n },\n}));\n\nconst ConsentPageLayout = ({\n title,\n children,\n}: {\n title: string;\n children: React.ReactNode;\n}) => (\n <Page themeId=\"tool\">\n <Header title={title} />\n <Content>{children}</Content>\n </Page>\n);\n\nexport const ConsentPage = () => {\n const classes = useStyles();\n const { sessionId } = useParams<{ sessionId: string }>();\n const { state, handleAction } = useConsentSession({ sessionId });\n\n if (!sessionId) {\n return (\n <ConsentPageLayout title=\"Authorization Error\">\n <EmptyState\n missing=\"data\"\n title=\"Invalid Request\"\n description=\"The consent request ID is missing or invalid.\"\n />\n </ConsentPageLayout>\n );\n }\n\n if (state.status === 'loading') {\n return (\n <ConsentPageLayout title=\"Authorization Request\">\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n minHeight={300}\n >\n <Progress />\n </Box>\n </ConsentPageLayout>\n );\n }\n\n if (state.status === 'error') {\n return (\n <ConsentPageLayout title=\"Authorization Error\">\n <ResponseErrorPanel error={new Error(state.error)} />\n </ConsentPageLayout>\n );\n }\n\n if (state.status === 'completed') {\n return (\n <ConsentPageLayout title=\"Authorization Complete\">\n <Card className={classes.authCard}>\n <CardContent>\n <Box textAlign=\"center\">\n {state.action === 'approve' ? (\n <CheckCircleIcon\n style={{ fontSize: 64, color: 'green', marginBottom: 16 }}\n />\n ) : (\n <CancelIcon\n style={{ fontSize: 64, color: 'red', marginBottom: 16 }}\n />\n )}\n <Typography variant=\"h5\" gutterBottom>\n {state.action === 'approve'\n ? 'Authorization Approved'\n : 'Authorization Denied'}\n </Typography>\n <Typography variant=\"body1\" color=\"textSecondary\" gutterBottom>\n {state.action === 'approve'\n ? 'You have successfully authorized the application to access your Backstage account.'\n : 'You have denied the application access to your Backstage account.'}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Redirecting to the application...\n </Typography>\n </Box>\n </CardContent>\n </Card>\n </ConsentPageLayout>\n );\n }\n\n const session = state.session;\n const isSubmitting = state.status === 'submitting';\n const appName = session.clientName ?? session.clientId;\n\n return (\n <ConsentPageLayout title=\"Authorization Request\">\n <Card className={classes.authCard}>\n <CardContent>\n <Box className={classes.appHeader}>\n <AppsIcon className={classes.appIcon} />\n <Box>\n <Typography className={classes.appName}>{appName}</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n wants to access your Backstage account\n </Typography>\n </Box>\n </Box>\n\n <Divider />\n\n <Alert\n severity=\"warning\"\n icon={<WarningIcon />}\n className={classes.securityWarning}\n >\n <Typography variant=\"body2\">\n <strong>Security Notice:</strong> By authorizing this application,\n you are granting it access to your Backstage account. The\n application will receive an access token that allows it to act on\n your behalf.\n </Typography>\n <Box mt={1}>\n <Typography variant=\"body2\">\n <strong>Callback URL:</strong>\n </Typography>\n <Box className={classes.callbackUrl}>{session.redirectUri}</Box>\n </Box>\n </Alert>\n\n <Box mt={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure you trust this application and recognize the callback\n URL above. Only authorize applications you trust.\n </Typography>\n </Box>\n </CardContent>\n\n <CardActions className={classes.buttonContainer}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"large\"\n disabled={isSubmitting}\n onClick={() => handleAction('reject')}\n startIcon={<CancelIcon />}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"large\"\n disabled={isSubmitting}\n onClick={() => handleAction('approve')}\n startIcon={<CheckCircleIcon />}\n >\n {isSubmitting ? 'Authorizing...' : 'Authorize'}\n </Button>\n </CardActions>\n </Card>\n </ConsentPageLayout>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AA0CA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,GAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC5B;AAAA,EACA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC/B;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC5B,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC;AAAA,GAC5B;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB,eAAA;AAAA,IAChB,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACpB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC1B;AAAA,EACA,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,WAAA;AAAA,IACZ,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,OAAA;AAAA,IAC1C,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,IAC1B,SAAA,EAAW,WAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,OAAA;AAAA,IAC1C,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,IAC1B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAE5B,CAAA,CAAE,CAAA;AAEF,MAAM,oBAAoB,CAAC;AAAA,EACzB,KAAA;AAAA,EACA;AACF,CAAA,qBAIE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,UAAO,KAAA,EAAc,CAAA;AAAA,kBACtB,GAAA,CAAC,WAAS,QAAA,EAAS;AAAA,CAAA,EACrB,CAAA;AAGK,MAAM,cAAc,MAAM;AAC/B,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,SAAA,EAAiC;AACvD,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,KAAiB,iBAAA,CAAkB,EAAE,WAAW,CAAA;AAE/D,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBACE,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,qBAAA,EACvB,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAM,iBAAA;AAAA,QACN,WAAA,EAAY;AAAA;AAAA,KACd,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,SAAA,EAAW;AAC9B,IAAA,uBACE,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,uBAAA,EACvB,QAAA,kBAAA,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,MAAA;AAAA,QACR,cAAA,EAAe,QAAA;AAAA,QACf,UAAA,EAAW,QAAA;AAAA,QACX,SAAA,EAAW,GAAA;AAAA,QAEX,8BAAC,QAAA,EAAA,EAAS;AAAA;AAAA,KACZ,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,OAAA,EAAS;AAC5B,IAAA,uBACE,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,qBAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAO,IAAI,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EAAG,CAAA,EACrD,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAChC,IAAA,uBACE,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAM,wBAAA,EACvB,8BAAC,IAAA,EAAA,EAAK,SAAA,EAAW,OAAA,CAAQ,QAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,WAAU,QAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,WAAW,SAAA,mBAChB,GAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,OAAO,EAAE,QAAA,EAAU,IAAI,KAAA,EAAO,OAAA,EAAS,cAAc,EAAA;AAAG;AAAA,OAC1D,mBAEA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAO,EAAE,QAAA,EAAU,IAAI,KAAA,EAAO,KAAA,EAAO,cAAc,EAAA;AAAG;AAAA,OACxD;AAAA,sBAEF,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,YAAA,EAAY,MAClC,QAAA,EAAA,KAAA,CAAM,MAAA,KAAW,SAAA,GACd,wBAAA,GACA,sBAAA,EACN,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,eAAA,EAAgB,YAAA,EAAY,IAAA,EAC3D,QAAA,EAAA,KAAA,CAAM,MAAA,KAAW,SAAA,GACd,oFAAA,GACA,mEAAA,EACN,CAAA;AAAA,0BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,iBAAgB,QAAA,EAAA,mCAAA,EAElD;AAAA,KAAA,EACF,CAAA,EACF,GACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,MAAM,YAAA,GAAe,MAAM,MAAA,KAAW,YAAA;AACtC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,QAAA;AAE9C,EAAA,uBACE,GAAA,CAAC,qBAAkB,KAAA,EAAM,uBAAA,EACvB,+BAAC,IAAA,EAAA,EAAK,SAAA,EAAW,QAAQ,QAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,SAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAS,CAAA;AAAA,6BACrC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,8BAChD,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,iBAAgB,QAAA,EAAA,wCAAA,EAElD;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,0BAEC,OAAA,EAAA,EAAQ,CAAA;AAAA,sBAET,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAS,SAAA;AAAA,UACT,IAAA,sBAAO,WAAA,EAAA,EAAY,CAAA;AAAA,UACnB,WAAW,OAAA,CAAQ,eAAA;AAAA,UAEnB,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,OAAA,EAClB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,YAAO,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,cAAS;AAAA,aAAA,EAInC,CAAA;AAAA,4BACA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAClB,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,2BAAa,CAAA,EACvB,CAAA;AAAA,kCACC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,WAAA,EAAc,kBAAQ,WAAA,EAAY;AAAA,aAAA,EAC5D;AAAA;AAAA;AAAA,OACF;AAAA,sBAEA,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EACP,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,eAAA,EAAgB,QAAA,EAAA,mHAAA,EAGlD,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,OAAA,CAAQ,eAAA,EAC9B,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,UAAA;AAAA,UACR,KAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,QAAA,EAAU,YAAA;AAAA,UACV,OAAA,EAAS,MAAM,YAAA,CAAa,QAAQ,CAAA;AAAA,UACpC,SAAA,sBAAY,UAAA,EAAA,EAAW,CAAA;AAAA,UACxB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,KAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAK,OAAA;AAAA,UACL,QAAA,EAAU,YAAA;AAAA,UACV,OAAA,EAAS,MAAM,YAAA,CAAa,SAAS,CAAA;AAAA,UACrC,SAAA,sBAAY,eAAA,EAAA,EAAgB,CAAA;AAAA,UAE3B,yBAAe,gBAAA,GAAmB;AAAA;AAAA;AACrC,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"ConsentPage.esm.js","sources":["../../../src/components/ConsentPage/ConsentPage.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useParams } from 'react-router-dom';\n\nimport {\n Box,\n Button,\n Card,\n CardActions,\n CardContent,\n Divider,\n makeStyles,\n Typography,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport AppsIcon from '@material-ui/icons/Apps';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport {\n Content,\n EmptyState,\n Header,\n Page,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { useConsentSession } from './useConsentSession';\nimport { configApiRef, useApi } from '@backstage/frontend-plugin-api';\n\nconst useStyles = makeStyles(theme => ({\n authCard: {\n maxWidth: 600,\n margin: '0 auto',\n marginTop: theme.spacing(4),\n },\n appHeader: {\n display: 'flex',\n alignItems: 'center',\n marginBottom: theme.spacing(2),\n },\n appIcon: {\n marginRight: theme.spacing(2),\n fontSize: 40,\n },\n appName: {\n fontSize: '1.5rem',\n fontWeight: 'bold',\n },\n securityWarning: {\n margin: theme.spacing(2, 0),\n },\n buttonContainer: {\n display: 'flex',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n padding: theme.spacing(2),\n },\n callbackUrl: {\n fontFamily: 'monospace',\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n wordBreak: 'break-all',\n fontSize: '0.875rem',\n },\n scopeList: {\n backgroundColor: theme.palette.background.default,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(1),\n },\n}));\n\nconst ConsentPageLayout = ({\n title,\n children,\n}: {\n title: string;\n children: React.ReactNode;\n}) => (\n <Page themeId=\"tool\">\n <Header title={title} />\n <Content>{children}</Content>\n </Page>\n);\n\nexport const ConsentPage = () => {\n const classes = useStyles();\n const { sessionId } = useParams<{ sessionId: string }>();\n const { state, handleAction } = useConsentSession({ sessionId });\n const configApi = useApi(configApiRef);\n const appTitle = configApi.getOptionalString('app.title') ?? 'Backstage';\n\n if (!sessionId) {\n return (\n <ConsentPageLayout title=\"Authorization Error\">\n <EmptyState\n missing=\"data\"\n title=\"Invalid Request\"\n description=\"The consent request ID is missing or invalid.\"\n />\n </ConsentPageLayout>\n );\n }\n\n if (state.status === 'loading') {\n return (\n <ConsentPageLayout title=\"Authorization Request\">\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n minHeight={300}\n >\n <Progress />\n </Box>\n </ConsentPageLayout>\n );\n }\n\n if (state.status === 'error') {\n return (\n <ConsentPageLayout title=\"Authorization Error\">\n <ResponseErrorPanel error={new Error(state.error)} />\n </ConsentPageLayout>\n );\n }\n\n if (state.status === 'completed') {\n return (\n <ConsentPageLayout title=\"Authorization Complete\">\n <Card className={classes.authCard}>\n <CardContent>\n <Box textAlign=\"center\">\n {state.action === 'approve' ? (\n <CheckCircleIcon\n style={{ fontSize: 64, color: 'green', marginBottom: 16 }}\n />\n ) : (\n <CancelIcon\n style={{ fontSize: 64, color: 'red', marginBottom: 16 }}\n />\n )}\n <Typography variant=\"h5\" gutterBottom>\n {state.action === 'approve'\n ? 'Authorization Approved'\n : 'Authorization Denied'}\n </Typography>\n <Typography variant=\"body1\" color=\"textSecondary\" gutterBottom>\n {state.action === 'approve'\n ? `You have successfully authorized the application to access your ${appTitle} account.`\n : `You have denied the application access to your ${appTitle} account.`}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Redirecting to the application...\n </Typography>\n </Box>\n </CardContent>\n </Card>\n </ConsentPageLayout>\n );\n }\n\n const session = state.session;\n const isSubmitting = state.status === 'submitting';\n const appName = session.clientName ?? session.clientId;\n\n return (\n <ConsentPageLayout title=\"Authorization Request\">\n <Card className={classes.authCard}>\n <CardContent>\n <Box className={classes.appHeader}>\n <AppsIcon className={classes.appIcon} />\n <Box>\n <Typography className={classes.appName}>{appName}</Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n wants to access your {appTitle} account\n </Typography>\n </Box>\n </Box>\n\n <Divider />\n\n <Alert\n severity=\"warning\"\n icon={<WarningIcon />}\n className={classes.securityWarning}\n >\n <Typography variant=\"body2\">\n <strong>Security Notice:</strong> By authorizing this application,\n you are granting it access to your {appTitle} account. The\n application will receive an access token that allows it to act on\n your behalf.\n </Typography>\n <Box mt={1}>\n <Typography variant=\"body2\">\n <strong>Callback URL:</strong>\n </Typography>\n <Box className={classes.callbackUrl}>{session.redirectUri}</Box>\n </Box>\n </Alert>\n\n <Box mt={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure you trust this application and recognize the callback\n URL above. Only authorize applications you trust.\n </Typography>\n </Box>\n </CardContent>\n\n <CardActions className={classes.buttonContainer}>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"large\"\n disabled={isSubmitting}\n onClick={() => handleAction('reject')}\n startIcon={<CancelIcon />}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"large\"\n disabled={isSubmitting}\n onClick={() => handleAction('approve')}\n startIcon={<CheckCircleIcon />}\n >\n {isSubmitting ? 'Authorizing...' : 'Authorize'}\n </Button>\n </CardActions>\n </Card>\n </ConsentPageLayout>\n );\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api'
|
|
|
4
4
|
declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
|
|
5
5
|
root: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
6
6
|
}, {}, {
|
|
7
|
-
"page:auth": _backstage_frontend_plugin_api.
|
|
7
|
+
"page:auth": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
8
8
|
kind: "page";
|
|
9
9
|
name: undefined;
|
|
10
10
|
config: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-auth",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"backstage": {
|
|
5
5
|
"role": "frontend-plugin",
|
|
6
6
|
"pluginId": "auth",
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
"test": "backstage-cli package test"
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@backstage/core-components": "^0.18.
|
|
58
|
+
"@backstage/core-components": "^0.18.3",
|
|
59
59
|
"@backstage/errors": "^1.2.7",
|
|
60
|
-
"@backstage/frontend-plugin-api": "^0.
|
|
60
|
+
"@backstage/frontend-plugin-api": "^0.13.0",
|
|
61
61
|
"@backstage/theme": "^0.7.0",
|
|
62
62
|
"@material-ui/core": "^4.12.2",
|
|
63
63
|
"@material-ui/icons": "^4.9.1",
|
|
@@ -65,10 +65,10 @@
|
|
|
65
65
|
"react-use": "^17.2.4"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@backstage/cli": "^0.34.
|
|
69
|
-
"@backstage/dev-utils": "^1.1.
|
|
70
|
-
"@backstage/frontend-defaults": "^0.3.
|
|
71
|
-
"@backstage/test-utils": "^1.7.
|
|
68
|
+
"@backstage/cli": "^0.34.5",
|
|
69
|
+
"@backstage/dev-utils": "^1.1.17",
|
|
70
|
+
"@backstage/frontend-defaults": "^0.3.3",
|
|
71
|
+
"@backstage/test-utils": "^1.7.13",
|
|
72
72
|
"@testing-library/jest-dom": "^6.0.0",
|
|
73
73
|
"@testing-library/react": "^16.0.0",
|
|
74
74
|
"@testing-library/user-event": "^14.0.0",
|