keycloakify 4.7.0 → 4.7.3
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 +13 -0
- package/README.md +6 -4
- package/bin/build-keycloak-theme/build-keycloak-theme.js +4 -1
- package/bin/build-keycloak-theme/build-keycloak-theme.js.map +1 -1
- package/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.js +4 -1
- package/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.js.map +1 -1
- package/bin/tools/isM1.d.ts +1 -0
- package/bin/tools/isM1.js +28 -0
- package/bin/tools/isM1.js.map +1 -0
- package/lib/components/Login.js +31 -14
- package/lib/components/Login.js.map +1 -1
- package/package.json +5 -1
- package/src/bin/build-keycloak-theme/build-keycloak-theme.ts +4 -1
- package/src/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.ts +6 -1
- package/src/bin/tools/isM1.ts +5 -0
- package/src/lib/components/Login.tsx +48 -22
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
### **4.7.3** (2022-04-08)
|
2
|
+
|
3
|
+
- Mention that there is still problems with M1 Mac
|
4
|
+
|
5
|
+
### **4.7.2** (2022-04-06)
|
6
|
+
|
7
|
+
- #43: M1 Mac support
|
8
|
+
|
9
|
+
### **4.7.1** (2022-03-30)
|
10
|
+
|
11
|
+
- Improve browser autofill
|
12
|
+
- factorization
|
13
|
+
|
1
14
|
## **4.7.0** (2022-03-17)
|
2
15
|
|
3
16
|
- Add support for options validator
|
package/README.md
CHANGED
@@ -30,10 +30,6 @@
|
|
30
30
|
<img src="https://user-images.githubusercontent.com/6702424/110260457-a1c3d380-7fac-11eb-853a-80459b65626b.png">
|
31
31
|
</p>
|
32
32
|
|
33
|
-
> New in v4.7:
|
34
|
-
> Register with user profile enabled: Out of the box `options` validator support.
|
35
|
-
> [Example](https://user-images.githubusercontent.com/6702424/158911163-81e6bbe8-feb0-4dc8-abff-de199d7a678e.mov)
|
36
|
-
|
37
33
|
# Motivations
|
38
34
|
|
39
35
|
Keycloak provides [theme support](https://www.keycloak.org/docs/latest/server_development/#_themes) for web pages. This allows customizing the look and feel of end-user facing pages so they can be integrated with your applications.
|
@@ -478,6 +474,12 @@ and `kcRegisterContext["authorizedMailDomains"]` to validate on.
|
|
478
474
|
|
479
475
|
# Changelog highlights
|
480
476
|
|
477
|
+
# v4.7.2
|
478
|
+
|
479
|
+
> WARNING: This is broken.
|
480
|
+
> Testing with local Keycloak container working with M1 Mac. Thanks to [@eduardosanzb](https://github.com/InseeFrLab/keycloakify/issues/43#issuecomment-975699658).
|
481
|
+
> Be aware: When running M1s you are testing with Keycloak v15 else the local container spun will be a Keycloak v16.1.0.
|
482
|
+
|
481
483
|
# v4.7.0
|
482
484
|
|
483
485
|
Register with user profile enabled: Out of the box `options` validator support.
|
@@ -39,6 +39,7 @@ var child_process = __importStar(require("child_process"));
|
|
39
39
|
var generateDebugFiles_1 = require("./generateDebugFiles");
|
40
40
|
var url_1 = require("url");
|
41
41
|
var fs = __importStar(require("fs"));
|
42
|
+
var isM1_1 = require("../tools/isM1");
|
42
43
|
var reactProjectDirPath = process.cwd();
|
43
44
|
var doUseExternalAssets = ((_a = process.argv[2]) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === "--external-assets";
|
44
45
|
var parsedPackageJson = require((0, path_1.join)(reactProjectDirPath, "package.json"));
|
@@ -97,7 +98,9 @@ function main() {
|
|
97
98
|
keycloakThemeBuildingDirPath: exports.keycloakThemeBuildingDirPath,
|
98
99
|
themeName: themeName,
|
99
100
|
//We want, however to test in a container running the latest Keycloak version
|
100
|
-
|
101
|
+
//Except on M1 where we can't use the default image and we only have
|
102
|
+
//https://github.com/InseeFrLab/keycloakify/issues/43#issuecomment-975699658
|
103
|
+
"keycloakVersion": (0, isM1_1.getIsM1)() ? "15.0.2" : "16.1.0",
|
101
104
|
});
|
102
105
|
console.log([
|
103
106
|
"",
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"build-keycloak-theme.js","sourceRoot":"","sources":["../../src/bin/build-keycloak-theme/build-keycloak-theme.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mFAAkF;AAClF,mEAAkE;AAClE,6BAA4F;AAC5F,2DAA+C;AAC/C,2DAAyF;AACzF,2BAA0B;AAC1B,qCAAyB;
|
1
|
+
{"version":3,"file":"build-keycloak-theme.js","sourceRoot":"","sources":["../../src/bin/build-keycloak-theme/build-keycloak-theme.ts"],"names":[],"mappings":"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"}
|
@@ -22,12 +22,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.generateDebugFiles = exports.containerLaunchScriptBasename = void 0;
|
23
23
|
var fs = __importStar(require("fs"));
|
24
24
|
var path_1 = require("path");
|
25
|
+
var isM1_1 = require("../../tools/isM1");
|
25
26
|
exports.containerLaunchScriptBasename = "start_keycloak_testing_container.sh";
|
26
27
|
/** Files for being able to run a hot reload keycloak container */
|
27
28
|
function generateDebugFiles(params) {
|
28
29
|
var themeName = params.themeName, keycloakThemeBuildingDirPath = params.keycloakThemeBuildingDirPath, keycloakVersion = params.keycloakVersion;
|
29
30
|
fs.writeFileSync((0, path_1.join)(keycloakThemeBuildingDirPath, "Dockerfile"), Buffer.from([
|
30
|
-
"FROM
|
31
|
+
"FROM " + ((0, isM1_1.getIsM1)()
|
32
|
+
? "eduardosanzb/keycloak@sha256:b1f5bc674eaff6f4e7b37808b9863440310ff93c282fc9bff812377be48bf519"
|
33
|
+
: "jboss/keycloak:" + keycloakVersion),
|
31
34
|
"",
|
32
35
|
"USER root",
|
33
36
|
"",
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generateDebugFiles.js","sourceRoot":"","sources":["../../../src/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAyB;AACzB,6BAAgE;
|
1
|
+
{"version":3,"file":"generateDebugFiles.js","sourceRoot":"","sources":["../../../src/bin/build-keycloak-theme/generateDebugFiles/generateDebugFiles.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAyB;AACzB,6BAAgE;AAEhE,yCAA2C;AAE9B,QAAA,6BAA6B,GAAG,qCAAqC,CAAC;AAEnF,kEAAkE;AAClE,SAAgB,kBAAkB,CAAC,MAAqG;IAC5H,IAAA,SAAS,GAAoD,MAAM,UAA1D,EAAE,4BAA4B,GAAsB,MAAM,6BAA5B,EAAE,eAAe,GAAK,MAAM,gBAAX,CAAY;IAE5E,EAAE,CAAC,aAAa,CACZ,IAAA,WAAQ,EAAC,4BAA4B,EAAE,YAAY,CAAC,EACpD,MAAM,CAAC,IAAI,CACP;QACI,WACI,IAAA,cAAO,GAAE;YACL,CAAC,CAAC,+FAA+F;YACjG,CAAC,CAAC,oBAAkB,eAAiB,CAC3C;QACF,EAAE;QACF,WAAW;QACX,EAAE;QACF,WAAW;QACX,EAAE;QACF,iEAAiE;QACjE,EAAE;QACF,wDAAwD;KAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,MAAM,CACT,CACJ,CAAC;IAEF,IAAM,WAAW,GAAM,SAAS,yBAAsB,CAAC;IACvD,IAAM,aAAa,GAAG,4BAA4B,CAAC;IAEnD,EAAE,CAAC,aAAa,CACZ,IAAA,WAAQ,EAAC,4BAA4B,EAAE,qCAA6B,CAAC,EACrE,MAAM,CAAC,IAAI,CACP;QACI,aAAa;QACb,EAAE;QACF,QAAM,4BAA8B;QACpC,EAAE;QACF,eAAa,aAAa,aAAU;QACpC,EAAE;QACF,uBAAqB,WAAa;QAClC,EAAE;QACF,eAAe;QACf,oBAAoB;QACpB,eAAa,aAAa,QAAK;QAC/B,8BAA8B;QAC9B,kCAAkC;QAClC,+CAA+C;QAC/C,WAAS,IAAA,WAAQ,EACb,4BAA4B,EAC5B,KAAK,EACL,MAAM,EACN,WAAW,EACX,OAAO,EACP,SAAS,CACZ,oCAA+B,SAAS,WAAQ;QACjD,YAAU,WAAW,YAAS;QAC9B,EAAE;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,MAAM,CACT,EACD,EAAE,MAAM,EAAE,GAAK,EAAE,CACpB,CAAC;IAEF,IAAM,oBAAoB,GAAG,IAAA,WAAQ,EAAC,4BAA4B,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;IAE1G,IAAI;QACA,EAAE,CAAC,SAAS,CAAC,IAAA,cAAW,EAAC,oBAAoB,CAAC,CAAC,CAAC;KACnD;IAAC,WAAM,GAAE;IAEV,EAAE,CAAC,aAAa,CACZ,oBAAoB,EACpB,EAAE;SACG,YAAY,CAAC,IAAA,WAAQ,EAAC,SAAS,EAAE,mBAAiB,eAAe,SAAM,CAAC,CAAC;SACzE,QAAQ,CAAC,MAAM,CAAC;SAChB,OAAO,CACJ,IAAI,MAAM,CACN,CAAC,sCAAsC,EAAE,iCAAiC,EAAE,uCAAuC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EACjI,GAAG,CACN,EACD,CAAC,iCAAiC,EAAE,kCAAkC,EAAE,wCAAwC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/H,CACR,CAAC;AACN,CAAC;AAjFD,gDAiFC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare function getIsM1(): boolean;
|
@@ -0,0 +1,28 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
5
|
+
}) : (function(o, m, k, k2) {
|
6
|
+
if (k2 === undefined) k2 = k;
|
7
|
+
o[k2] = m[k];
|
8
|
+
}));
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
11
|
+
}) : function(o, v) {
|
12
|
+
o["default"] = v;
|
13
|
+
});
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
15
|
+
if (mod && mod.__esModule) return mod;
|
16
|
+
var result = {};
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
18
|
+
__setModuleDefault(result, mod);
|
19
|
+
return result;
|
20
|
+
};
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
22
|
+
exports.getIsM1 = void 0;
|
23
|
+
var os = __importStar(require("os"));
|
24
|
+
function getIsM1() {
|
25
|
+
return os.cpus()[0].model.includes("Apple M1");
|
26
|
+
}
|
27
|
+
exports.getIsM1 = getIsM1;
|
28
|
+
//# sourceMappingURL=isM1.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"isM1.js","sourceRoot":"","sources":["../../src/bin/tools/isM1.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAyB;AAEzB,SAAgB,OAAO;IACnB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACnD,CAAC;AAFD,0BAEC"}
|
package/lib/components/Login.js
CHANGED
@@ -46,23 +46,40 @@ var useKcMessage_1 = require("../i18n/useKcMessage");
|
|
46
46
|
var tss_react_1 = require("tss-react");
|
47
47
|
var useConstCallback_1 = require("powerhooks/useConstCallback");
|
48
48
|
exports.Login = (0, react_1.memo)(function (_a) {
|
49
|
-
var _b;
|
50
49
|
var kcContext = _a.kcContext, props = __rest(_a, ["kcContext"]);
|
51
50
|
var social = kcContext.social, realm = kcContext.realm, url = kcContext.url, usernameEditDisabled = kcContext.usernameEditDisabled, login = kcContext.login, auth = kcContext.auth, registrationDisabled = kcContext.registrationDisabled;
|
52
|
-
var
|
51
|
+
var _b = (0, useKcMessage_1.useKcMessage)(), msg = _b.msg, msgStr = _b.msgStr;
|
53
52
|
var cx = (0, tss_react_1.useCssAndCx)().cx;
|
54
|
-
var
|
55
|
-
var onSubmit = (0, useConstCallback_1.useConstCallback)(function () {
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
53
|
+
var _c = __read((0, react_1.useState)(false), 2), isLoginButtonDisabled = _c[0], setIsLoginButtonDisabled = _c[1];
|
54
|
+
var onSubmit = (0, useConstCallback_1.useConstCallback)(function (e) {
|
55
|
+
var _a;
|
56
|
+
e.preventDefault();
|
57
|
+
setIsLoginButtonDisabled(true);
|
58
|
+
var formElement = e.target;
|
59
|
+
//NOTE: Even if we login with email Keycloak expect username and password in
|
60
|
+
//the POST request.
|
61
|
+
(_a = formElement.querySelector("input[name='email']")) === null || _a === void 0 ? void 0 : _a.setAttribute("name", "username");
|
62
|
+
formElement.submit();
|
63
|
+
});
|
64
|
+
return ((0, jsx_runtime_1.jsx)(Template_1.Template, __assign({}, __assign({ kcContext: kcContext }, props), { doFetchDefaultThemeResources: true, displayInfo: social.displayInfo, displayWide: realm.password && social.providers !== undefined, headerNode: msg("doLogIn"), formNode: (0, jsx_runtime_1.jsxs)("div", __assign({ id: "kc-form", className: cx(realm.password && social.providers !== undefined && props.kcContentWrapperClass) }, { children: [(0, jsx_runtime_1.jsx)("div", __assign({ id: "kc-form-wrapper", className: cx(realm.password && social.providers && [props.kcFormSocialAccountContentClass, props.kcFormSocialAccountClass]) }, { children: realm.password && ((0, jsx_runtime_1.jsxs)("form", __assign({ id: "kc-form-login", onSubmit: onSubmit, action: url.loginAction, method: "post" }, { children: [(0, jsx_runtime_1.jsx)("div", __assign({ className: cx(props.kcFormGroupClass) }, { children: (function () {
|
65
|
+
var _a;
|
66
|
+
var label = !realm.loginWithEmailAllowed
|
67
|
+
? "username"
|
68
|
+
: realm.registrationEmailAsUsername
|
69
|
+
? "email"
|
70
|
+
: "usernameOrEmail";
|
71
|
+
var autoCompleteHelper = label === "usernameOrEmail" ? "username" : label;
|
72
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("label", __assign({ htmlFor: autoCompleteHelper, className: cx(props.kcLabelClass) }, { children: msg(label) }), void 0), (0, jsx_runtime_1.jsx)("input", __assign({ tabIndex: 1, id: autoCompleteHelper, className: cx(props.kcInputClass),
|
73
|
+
//NOTE: This is used by Google Chrome auto fill so we use it to tell
|
74
|
+
//the browser how to pre fill the form but before submit we put it back
|
75
|
+
//to username because it is what keycloak expects.
|
76
|
+
name: autoCompleteHelper, defaultValue: (_a = login.username) !== null && _a !== void 0 ? _a : "", type: "text" }, (usernameEditDisabled
|
77
|
+
? { "disabled": true }
|
78
|
+
: {
|
79
|
+
"autoFocus": true,
|
80
|
+
"autoComplete": "off",
|
81
|
+
})), void 0)] }, void 0));
|
82
|
+
})() }), void 0), (0, jsx_runtime_1.jsxs)("div", __assign({ className: cx(props.kcFormGroupClass) }, { children: [(0, jsx_runtime_1.jsx)("label", __assign({ htmlFor: "password", className: cx(props.kcLabelClass) }, { children: msg("password") }), void 0), (0, jsx_runtime_1.jsx)("input", { tabIndex: 2, id: "password", className: cx(props.kcInputClass), name: "password", type: "password", autoComplete: "off" }, void 0)] }), void 0), (0, jsx_runtime_1.jsxs)("div", __assign({ className: cx(props.kcFormGroupClass, props.kcFormSettingClass) }, { children: [(0, jsx_runtime_1.jsx)("div", __assign({ id: "kc-form-options" }, { children: realm.rememberMe && !usernameEditDisabled && ((0, jsx_runtime_1.jsx)("div", __assign({ className: "checkbox" }, { children: (0, jsx_runtime_1.jsxs)("label", { children: [(0, jsx_runtime_1.jsx)("input", __assign({ tabIndex: 3, id: "rememberMe", name: "rememberMe", type: "checkbox" }, (login.rememberMe
|
66
83
|
? {
|
67
84
|
"checked": true,
|
68
85
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Login.js","sourceRoot":"","sources":["../../src/lib/components/Login.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAAuC;AACvC,uCAAsC;AAGtC,qDAAoD;AACpD,uCAAwC;AACxC,gEAA+D;
|
1
|
+
{"version":3,"file":"Login.js","sourceRoot":"","sources":["../../src/lib/components/Login.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "keycloakify",
|
3
|
-
"version": "4.7.
|
3
|
+
"version": "4.7.3",
|
4
4
|
"description": "Keycloak theme generator for Reacts app",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -48,6 +48,7 @@
|
|
48
48
|
"src/bin/tools/getProjectRoot.ts",
|
49
49
|
"src/bin/tools/grant-exec-perms.ts",
|
50
50
|
"src/bin/tools/isInside.ts",
|
51
|
+
"src/bin/tools/isM1.ts",
|
51
52
|
"src/bin/tools/rm.ts",
|
52
53
|
"src/bin/tools/transformCodebase.ts",
|
53
54
|
"src/lib/components/Error.tsx",
|
@@ -162,6 +163,9 @@
|
|
162
163
|
"bin/tools/isInside.d.ts",
|
163
164
|
"bin/tools/isInside.js",
|
164
165
|
"bin/tools/isInside.js.map",
|
166
|
+
"bin/tools/isM1.d.ts",
|
167
|
+
"bin/tools/isM1.js",
|
168
|
+
"bin/tools/isM1.js.map",
|
165
169
|
"bin/tools/rm.d.ts",
|
166
170
|
"bin/tools/rm.js",
|
167
171
|
"bin/tools/rm.js.map",
|
@@ -5,6 +5,7 @@ import * as child_process from "child_process";
|
|
5
5
|
import { generateDebugFiles, containerLaunchScriptBasename } from "./generateDebugFiles";
|
6
6
|
import { URL } from "url";
|
7
7
|
import * as fs from "fs";
|
8
|
+
import { getIsM1 } from "../tools/isM1";
|
8
9
|
|
9
10
|
type ParsedPackageJson = {
|
10
11
|
name: string;
|
@@ -92,7 +93,9 @@ export function main() {
|
|
92
93
|
keycloakThemeBuildingDirPath,
|
93
94
|
themeName,
|
94
95
|
//We want, however to test in a container running the latest Keycloak version
|
95
|
-
|
96
|
+
//Except on M1 where we can't use the default image and we only have
|
97
|
+
//https://github.com/InseeFrLab/keycloakify/issues/43#issuecomment-975699658
|
98
|
+
"keycloakVersion": getIsM1() ? "15.0.2" : "16.1.0",
|
96
99
|
});
|
97
100
|
|
98
101
|
console.log(
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import * as fs from "fs";
|
2
2
|
import { join as pathJoin, dirname as pathDirname } from "path";
|
3
3
|
import type { KeycloakVersion } from "../../KeycloakVersion";
|
4
|
+
import { getIsM1 } from "../../tools/isM1";
|
4
5
|
|
5
6
|
export const containerLaunchScriptBasename = "start_keycloak_testing_container.sh";
|
6
7
|
|
@@ -12,7 +13,11 @@ export function generateDebugFiles(params: { keycloakVersion: KeycloakVersion; t
|
|
12
13
|
pathJoin(keycloakThemeBuildingDirPath, "Dockerfile"),
|
13
14
|
Buffer.from(
|
14
15
|
[
|
15
|
-
`FROM
|
16
|
+
`FROM ${
|
17
|
+
getIsM1()
|
18
|
+
? "eduardosanzb/keycloak@sha256:b1f5bc674eaff6f4e7b37808b9863440310ff93c282fc9bff812377be48bf519"
|
19
|
+
: `jboss/keycloak:${keycloakVersion}`
|
20
|
+
}`,
|
16
21
|
"",
|
17
22
|
"USER root",
|
18
23
|
"",
|
@@ -5,6 +5,7 @@ import type { KcContextBase } from "../getKcContext/KcContextBase";
|
|
5
5
|
import { useKcMessage } from "../i18n/useKcMessage";
|
6
6
|
import { useCssAndCx } from "tss-react";
|
7
7
|
import { useConstCallback } from "powerhooks/useConstCallback";
|
8
|
+
import type { FormEventHandler } from "react";
|
8
9
|
|
9
10
|
export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Login } & KcProps) => {
|
10
11
|
const { social, realm, url, usernameEditDisabled, login, auth, registrationDisabled } = kcContext;
|
@@ -15,7 +16,19 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
|
15
16
|
|
16
17
|
const [isLoginButtonDisabled, setIsLoginButtonDisabled] = useState(false);
|
17
18
|
|
18
|
-
const onSubmit = useConstCallback(
|
19
|
+
const onSubmit = useConstCallback<FormEventHandler<HTMLFormElement>>(e => {
|
20
|
+
e.preventDefault();
|
21
|
+
|
22
|
+
setIsLoginButtonDisabled(true);
|
23
|
+
|
24
|
+
const formElement = e.target as HTMLFormElement;
|
25
|
+
|
26
|
+
//NOTE: Even if we login with email Keycloak expect username and password in
|
27
|
+
//the POST request.
|
28
|
+
formElement.querySelector("input[name='email']")?.setAttribute("name", "username");
|
29
|
+
|
30
|
+
formElement.submit();
|
31
|
+
});
|
19
32
|
|
20
33
|
return (
|
21
34
|
<Template
|
@@ -33,27 +46,40 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
|
33
46
|
{realm.password && (
|
34
47
|
<form id="kc-form-login" onSubmit={onSubmit} action={url.loginAction} method="post">
|
35
48
|
<div className={cx(props.kcFormGroupClass)}>
|
36
|
-
|
37
|
-
|
38
|
-
?
|
39
|
-
:
|
40
|
-
?
|
41
|
-
:
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
49
|
+
{(() => {
|
50
|
+
const label = !realm.loginWithEmailAllowed
|
51
|
+
? "username"
|
52
|
+
: realm.registrationEmailAsUsername
|
53
|
+
? "email"
|
54
|
+
: "usernameOrEmail";
|
55
|
+
|
56
|
+
const autoCompleteHelper: typeof label = label === "usernameOrEmail" ? "username" : label;
|
57
|
+
|
58
|
+
return (
|
59
|
+
<>
|
60
|
+
<label htmlFor={autoCompleteHelper} className={cx(props.kcLabelClass)}>
|
61
|
+
{msg(label)}
|
62
|
+
</label>
|
63
|
+
<input
|
64
|
+
tabIndex={1}
|
65
|
+
id={autoCompleteHelper}
|
66
|
+
className={cx(props.kcInputClass)}
|
67
|
+
//NOTE: This is used by Google Chrome auto fill so we use it to tell
|
68
|
+
//the browser how to pre fill the form but before submit we put it back
|
69
|
+
//to username because it is what keycloak expects.
|
70
|
+
name={autoCompleteHelper}
|
71
|
+
defaultValue={login.username ?? ""}
|
72
|
+
type="text"
|
73
|
+
{...(usernameEditDisabled
|
74
|
+
? { "disabled": true }
|
75
|
+
: {
|
76
|
+
"autoFocus": true,
|
77
|
+
"autoComplete": "off",
|
78
|
+
})}
|
79
|
+
/>
|
80
|
+
</>
|
81
|
+
);
|
82
|
+
})()}
|
57
83
|
</div>
|
58
84
|
<div className={cx(props.kcFormGroupClass)}>
|
59
85
|
<label htmlFor="password" className={cx(props.kcLabelClass)}>
|