@backstage/plugin-auth 0.0.0-nightly-20251009023727 → 0.0.0-nightly-20251022024054

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,14 +1,35 @@
1
1
  # @backstage/plugin-auth
2
2
 
3
- ## 0.0.0-nightly-20251009023727
3
+ ## 0.0.0-nightly-20251022024054
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - 1609e79: Authentication content screen now uses application title.
7
8
  - Updated dependencies
8
- - @backstage/core-components@0.0.0-nightly-20251009023727
9
- - @backstage/frontend-plugin-api@0.0.0-nightly-20251009023727
10
- - @backstage/theme@0.0.0-nightly-20251009023727
9
+ - @backstage/core-components@0.0.0-nightly-20251022024054
10
+ - @backstage/frontend-plugin-api@0.0.0-nightly-20251022024054
11
11
  - @backstage/errors@1.2.7
12
+ - @backstage/theme@0.7.0
13
+
14
+ ## 0.1.2-next.0
15
+
16
+ ### Patch Changes
17
+
18
+ - 1609e79: Authentication content screen now uses application title.
19
+ - Updated dependencies
20
+ - @backstage/core-components@0.18.3-next.0
21
+ - @backstage/frontend-plugin-api@0.12.2-next.0
22
+ - @backstage/errors@1.2.7
23
+ - @backstage/theme@0.7.0
24
+
25
+ ## 0.1.1
26
+
27
+ ### Patch Changes
28
+
29
+ - Updated dependencies
30
+ - @backstage/core-components@0.18.2
31
+ - @backstage/frontend-plugin-api@0.12.1
32
+ - @backstage/theme@0.7.0
12
33
 
13
34
  ## 0.1.1-next.1
14
35
 
@@ -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" ? "You have successfully authorized the application to access your Backstage account." : "You have denied the application access to your Backstage account." }),
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__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: "wants to access your Backstage account" })
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 Backstage account. The application will receive an access token that allows it to act on your behalf."
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":"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"}
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-auth",
3
- "version": "0.0.0-nightly-20251009023727",
3
+ "version": "0.0.0-nightly-20251022024054",
4
4
  "backstage": {
5
5
  "role": "frontend-plugin",
6
6
  "pluginId": "auth",
@@ -55,20 +55,20 @@
55
55
  "test": "backstage-cli package test"
56
56
  },
57
57
  "dependencies": {
58
- "@backstage/core-components": "0.0.0-nightly-20251009023727",
58
+ "@backstage/core-components": "0.0.0-nightly-20251022024054",
59
59
  "@backstage/errors": "1.2.7",
60
- "@backstage/frontend-plugin-api": "0.0.0-nightly-20251009023727",
61
- "@backstage/theme": "0.0.0-nightly-20251009023727",
60
+ "@backstage/frontend-plugin-api": "0.0.0-nightly-20251022024054",
61
+ "@backstage/theme": "0.7.0",
62
62
  "@material-ui/core": "^4.12.2",
63
63
  "@material-ui/icons": "^4.9.1",
64
64
  "@material-ui/lab": "4.0.0-alpha.61",
65
65
  "react-use": "^17.2.4"
66
66
  },
67
67
  "devDependencies": {
68
- "@backstage/cli": "0.0.0-nightly-20251009023727",
69
- "@backstage/dev-utils": "0.0.0-nightly-20251009023727",
70
- "@backstage/frontend-defaults": "0.0.0-nightly-20251009023727",
71
- "@backstage/test-utils": "0.0.0-nightly-20251009023727",
68
+ "@backstage/cli": "0.0.0-nightly-20251022024054",
69
+ "@backstage/dev-utils": "0.0.0-nightly-20251022024054",
70
+ "@backstage/frontend-defaults": "0.0.0-nightly-20251022024054",
71
+ "@backstage/test-utils": "0.0.0-nightly-20251022024054",
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",