@multiplatform.one/wallet 7.7.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/README.md +8 -0
- package/dist/cjs/SiweKeycloakProvider.cjs +273 -0
- package/dist/cjs/SiweKeycloakProvider.native.js +309 -0
- package/dist/cjs/SiweKeycloakProvider.native.js.map +1 -0
- package/dist/cjs/base64.cjs +51 -0
- package/dist/cjs/base64.native.js +55 -0
- package/dist/cjs/base64.native.js.map +1 -0
- package/dist/cjs/base64.spec.cjs +57 -0
- package/dist/cjs/base64.spec.native.js +79 -0
- package/dist/cjs/base64.spec.native.js.map +1 -0
- package/dist/cjs/context.cjs +29 -0
- package/dist/cjs/context.native.js +32 -0
- package/dist/cjs/context.native.js.map +1 -0
- package/dist/cjs/hooks/context.cjs +29 -0
- package/dist/cjs/hooks/context.native.js +32 -0
- package/dist/cjs/hooks/context.native.js.map +1 -0
- package/dist/cjs/hooks/index.cjs +20 -0
- package/dist/cjs/hooks/index.native.js +23 -0
- package/dist/cjs/hooks/index.native.js.map +1 -0
- package/dist/cjs/hooks/useSiweKeycloak.cjs +61 -0
- package/dist/cjs/hooks/useSiweKeycloak.native.js +64 -0
- package/dist/cjs/hooks/useSiweKeycloak.native.js.map +1 -0
- package/dist/cjs/index.cjs +133 -0
- package/dist/cjs/index.native.js +189 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/render.cjs +78 -0
- package/dist/cjs/render.native.js +82 -0
- package/dist/cjs/render.native.js.map +1 -0
- package/dist/cjs/siwe.cjs +76 -0
- package/dist/cjs/siwe.native.js +94 -0
- package/dist/cjs/siwe.native.js.map +1 -0
- package/dist/cjs/types.cjs +18 -0
- package/dist/cjs/types.native.js +21 -0
- package/dist/cjs/types.native.js.map +1 -0
- package/dist/cjs/util.cjs +53 -0
- package/dist/cjs/util.native.js +56 -0
- package/dist/cjs/util.native.js.map +1 -0
- package/dist/cjs/util.spec.cjs +53 -0
- package/dist/cjs/util.spec.native.js +62 -0
- package/dist/cjs/util.spec.native.js.map +1 -0
- package/dist/esm/SiweKeycloakProvider.mjs +237 -0
- package/dist/esm/SiweKeycloakProvider.mjs.map +1 -0
- package/dist/esm/SiweKeycloakProvider.native.js +270 -0
- package/dist/esm/SiweKeycloakProvider.native.js.map +1 -0
- package/dist/esm/base64.mjs +26 -0
- package/dist/esm/base64.mjs.map +1 -0
- package/dist/esm/base64.native.js +27 -0
- package/dist/esm/base64.native.js.map +1 -0
- package/dist/esm/base64.spec.mjs +58 -0
- package/dist/esm/base64.spec.mjs.map +1 -0
- package/dist/esm/base64.spec.native.js +77 -0
- package/dist/esm/base64.spec.native.js.map +1 -0
- package/dist/esm/context.mjs +4 -0
- package/dist/esm/context.mjs.map +1 -0
- package/dist/esm/context.native.js +4 -0
- package/dist/esm/context.native.js.map +1 -0
- package/dist/esm/hooks/context.mjs +4 -0
- package/dist/esm/hooks/context.mjs.map +1 -0
- package/dist/esm/hooks/context.native.js +4 -0
- package/dist/esm/hooks/context.native.js.map +1 -0
- package/dist/esm/hooks/index.mjs +2 -0
- package/dist/esm/hooks/index.mjs.map +1 -0
- package/dist/esm/hooks/index.native.js +2 -0
- package/dist/esm/hooks/index.native.js.map +1 -0
- package/dist/esm/hooks/useSiweKeycloak.mjs +36 -0
- package/dist/esm/hooks/useSiweKeycloak.mjs.map +1 -0
- package/dist/esm/hooks/useSiweKeycloak.native.js +36 -0
- package/dist/esm/hooks/useSiweKeycloak.native.js.map +1 -0
- package/dist/esm/index.mjs +107 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +160 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/render.mjs +42 -0
- package/dist/esm/render.mjs.map +1 -0
- package/dist/esm/render.native.js +43 -0
- package/dist/esm/render.native.js.map +1 -0
- package/dist/esm/siwe.mjs +51 -0
- package/dist/esm/siwe.mjs.map +1 -0
- package/dist/esm/siwe.native.js +66 -0
- package/dist/esm/siwe.native.js.map +1 -0
- package/dist/esm/types.mjs +2 -0
- package/dist/esm/types.mjs.map +1 -0
- package/dist/esm/types.native.js +2 -0
- package/dist/esm/types.native.js.map +1 -0
- package/dist/esm/util.mjs +27 -0
- package/dist/esm/util.mjs.map +1 -0
- package/dist/esm/util.native.js +27 -0
- package/dist/esm/util.native.js.map +1 -0
- package/dist/esm/util.spec.mjs +54 -0
- package/dist/esm/util.spec.mjs.map +1 -0
- package/dist/esm/util.spec.native.js +60 -0
- package/dist/esm/util.spec.native.js.map +1 -0
- package/package.json +81 -0
- package/src/SiweKeycloakProvider.tsx +297 -0
- package/src/base64.spec.ts +65 -0
- package/src/base64.ts +26 -0
- package/src/context.ts +10 -0
- package/src/hooks/context.ts +10 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useSiweKeycloak.ts +23 -0
- package/src/index.ts +127 -0
- package/src/main/java/com/bitspur/keycloak/siwe/Errors.java +21 -0
- package/src/main/java/com/bitspur/keycloak/siwe/LiteAuthenticationService.java +167 -0
- package/src/main/java/com/bitspur/keycloak/siwe/SiweCredentials.java +36 -0
- package/src/main/java/com/bitspur/keycloak/siwe/SiweSession.java +36 -0
- package/src/main/java/com/bitspur/keycloak/siwe/SiweUtil.java +599 -0
- package/src/main/java/com/bitspur/keycloak/siwe/Token.java +85 -0
- package/src/main/java/com/bitspur/keycloak/siwe/authenticators/browser/SiweBrowserAuthenticator.java +109 -0
- package/src/main/java/com/bitspur/keycloak/siwe/authenticators/browser/SiweBrowserAuthenticatorFactory.java +93 -0
- package/src/main/java/com/bitspur/keycloak/siwe/authenticators/directgrant/SiweDirectGrantAuthenticator.java +153 -0
- package/src/main/java/com/bitspur/keycloak/siwe/authenticators/directgrant/SiweDirectGrantAuthenticatorFactory.java +93 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonce.java +95 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonceJpaEntityProvider.java +82 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonceJpaEntityProviderFactory.java +46 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletAddress.java +103 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletJpaEntityProvider.java +43 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletJpaEntityProviderFactory.java +46 -0
- package/src/main/java/com/bitspur/keycloak/siwe/protocol/SiweWalletProtocolMapper.java +85 -0
- package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResource.java +210 -0
- package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResourceProvider.java +34 -0
- package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResourceProviderFactory.java +46 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuCredentials.java +52 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuMessage.java +362 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuParseException.java +23 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuUtil.java +547 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/browser/SiuBrowserAuthenticator.java +112 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/browser/SiuBrowserAuthenticatorFactory.java +96 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/directgrant/SiuDirectGrantAuthenticator.java +169 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/directgrant/SiuDirectGrantAuthenticatorFactory.java +96 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResource.java +244 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResourceProvider.java +34 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResourceProviderFactory.java +48 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsCredentials.java +52 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsMessage.java +362 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsParseException.java +23 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsUtil.java +564 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/browser/SiwsBrowserAuthenticator.java +112 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/browser/SiwsBrowserAuthenticatorFactory.java +96 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/directgrant/SiwsDirectGrantAuthenticator.java +169 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/directgrant/SiwsDirectGrantAuthenticatorFactory.java +96 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResource.java +244 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResourceProvider.java +34 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResourceProviderFactory.java +48 -0
- package/src/main/resources/META-INF/keycloak-themes.json +8 -0
- package/src/main/resources/META-INF/services/org.keycloak.authentication.AuthenticatorFactory +6 -0
- package/src/main/resources/META-INF/services/org.keycloak.connections.jpa.entityprovider.JpaEntityProviderFactory +2 -0
- package/src/main/resources/META-INF/services/org.keycloak.protocol.ProtocolMapper +1 -0
- package/src/main/resources/META-INF/services/org.keycloak.services.resource.RealmResourceProviderFactory +3 -0
- package/src/main/resources/META-INF/siwe-nonce-changelog.xml +29 -0
- package/src/main/resources/META-INF/siwe-wallet-changelog.xml +46 -0
- package/src/render.tsx +47 -0
- package/src/siwe.tsx +57 -0
- package/src/types.ts +6 -0
- package/src/util.spec.ts +72 -0
- package/src/util.ts +28 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all) __defProp(target, name, {
|
|
9
|
+
get: all[name],
|
|
10
|
+
enumerable: true
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
16
|
+
get: () => from[key],
|
|
17
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
23
|
+
value: true
|
|
24
|
+
}), mod);
|
|
25
|
+
var util_exports = {};
|
|
26
|
+
__export(util_exports, {
|
|
27
|
+
createMessage: () => createMessage,
|
|
28
|
+
getNonce: () => getNonce
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(util_exports);
|
|
31
|
+
var import_siwe = require("siwe");
|
|
32
|
+
async function getNonce(keycloakSiweUrl) {
|
|
33
|
+
var res = await fetch(`${keycloakSiweUrl}/nonce`, {
|
|
34
|
+
credentials: "include"
|
|
35
|
+
});
|
|
36
|
+
if (res.ok) {
|
|
37
|
+
var data = await res.text();
|
|
38
|
+
if (data === null || data === void 0 ? void 0 : data.length) return data;
|
|
39
|
+
}
|
|
40
|
+
throw new Error("failed to get nonce");
|
|
41
|
+
}
|
|
42
|
+
async function createMessage(nonce, address, chainId) {
|
|
43
|
+
if (typeof window === "undefined") {
|
|
44
|
+
throw new Error("createMessage requires browser context");
|
|
45
|
+
}
|
|
46
|
+
return new import_siwe.SiweMessage({
|
|
47
|
+
version: "1",
|
|
48
|
+
domain: window.location.host,
|
|
49
|
+
uri: window.location.origin,
|
|
50
|
+
address,
|
|
51
|
+
chainId,
|
|
52
|
+
nonce,
|
|
53
|
+
statement: "Sign in With Ethereum."
|
|
54
|
+
}).prepareMessage();
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=util.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","util_exports","__export","createMessage","getNonce","module","exports","import_siwe","require","keycloakSiweUrl","res","fetch","credentials","ok","data","text","length","Error","nonce","address","chainId","window","SiweMessage","version","domain","location","host","uri","origin","statement","prepareMessage"],"sources":["../../src/util.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,YAAA;AAAAC,QAAA,CAAAD,YAAA;EAAAE,aAAA,EAAAA,CAAA,KAAAA,aAAA;EAAAC,QAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,GAAAV,YAA4B,CAAAK,YAAA;AAG5B,IAAAM,WAAsB,GAAAC,OAAS;AAC7B,eAAYJ,QAAMA,CAAAK,eAAS;EAAyB,IAClDC,GAAA,SAAaC,KAAA,IAAAF,eAAA;IACdG,WAAA;EACD;EACE,IAAAF,GAAA,CAAMG,EAAA;IACN,IAAIC,IAAA,GAAM,MAAQJ,GAAA,CAAAK,IAAO;IAC3B,IAAAD,IAAA,aAAAA,IAAA,uBAAAA,IAAA,CAAAE,MAAA,SAAAF,IAAA;EACA;EACF,UAAAG,KAAA;AAEA;AACE,eAAWd,aAAWA,CAAAe,KAAA,EAAAC,OAAa,EAAAC,OAAA;EACjC,WAAMC,MAAI,KAAM;IAClB,UAAAJ,KAAA;EACA;EAAuB,OACrB,IAASV,WAAA,CAAAe,WAAA;IACTC,OAAA,EAAQ;IACRC,MAAK,EAAAH,MAAO,CAAAI,QAAS,CAAAC,IAAA;IACrBC,GAAA,EAAAN,MAAA,CAAAI,QAAA,CAAAG,MAAA;IACAT,OAAA;IACAC,OAAA;IACAF,KAAA;IACDW,SAAE;EACL,GAAAC,cAAA","ignoreList":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
var import_vitest = require("vitest");
|
|
2
|
+
var import_util = require("./util.cjs");
|
|
3
|
+
(0, import_vitest.describe)("getNonce", () => {
|
|
4
|
+
(0, import_vitest.beforeEach)(() => {
|
|
5
|
+
import_vitest.vi.stubGlobal("fetch", import_vitest.vi.fn().mockResolvedValue({
|
|
6
|
+
ok: true,
|
|
7
|
+
text: () => Promise.resolve("abc123nonce")
|
|
8
|
+
}));
|
|
9
|
+
});
|
|
10
|
+
(0, import_vitest.afterEach)(() => {
|
|
11
|
+
import_vitest.vi.restoreAllMocks();
|
|
12
|
+
});
|
|
13
|
+
(0, import_vitest.it)("fetches nonce from the keycloak SIWE URL", async () => {
|
|
14
|
+
const nonce = await (0, import_util.getNonce)("https://auth.example.com/siwe");
|
|
15
|
+
(0, import_vitest.expect)(fetch).toHaveBeenCalledWith("https://auth.example.com/siwe/nonce", {
|
|
16
|
+
credentials: "include"
|
|
17
|
+
});
|
|
18
|
+
(0, import_vitest.expect)(nonce).toBe("abc123nonce");
|
|
19
|
+
});
|
|
20
|
+
(0, import_vitest.it)("throws when response is not ok", async () => {
|
|
21
|
+
import_vitest.vi.stubGlobal("fetch", import_vitest.vi.fn().mockResolvedValue({
|
|
22
|
+
ok: false,
|
|
23
|
+
text: () => Promise.resolve("")
|
|
24
|
+
}));
|
|
25
|
+
await (0, import_vitest.expect)((0, import_util.getNonce)("https://auth.example.com/siwe")).rejects.toThrow("failed to get nonce");
|
|
26
|
+
});
|
|
27
|
+
(0, import_vitest.it)("throws when response body is empty", async () => {
|
|
28
|
+
import_vitest.vi.stubGlobal("fetch", import_vitest.vi.fn().mockResolvedValue({
|
|
29
|
+
ok: true,
|
|
30
|
+
text: () => Promise.resolve("")
|
|
31
|
+
}));
|
|
32
|
+
await (0, import_vitest.expect)((0, import_util.getNonce)("https://auth.example.com/siwe")).rejects.toThrow("failed to get nonce");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
(0, import_vitest.describe)("createMessage", () => {
|
|
36
|
+
(0, import_vitest.it)("throws when window is undefined (non-browser)", async () => {
|
|
37
|
+
const origWindow = globalThis.window;
|
|
38
|
+
delete globalThis.window;
|
|
39
|
+
try {
|
|
40
|
+
await (0, import_vitest.expect)((0, import_util.createMessage)("nonce123", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", 1)).rejects.toThrow("createMessage requires browser context");
|
|
41
|
+
} finally {
|
|
42
|
+
globalThis.window = origWindow;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
(0, import_vitest.it)("creates a SIWE message using browser location", async () => {
|
|
46
|
+
const addr = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045";
|
|
47
|
+
const message = await (0, import_util.createMessage)("nonce123", addr, 1);
|
|
48
|
+
(0, import_vitest.expect)(message).toContain("Sign in With Ethereum.");
|
|
49
|
+
(0, import_vitest.expect)(message).toContain("nonce123");
|
|
50
|
+
(0, import_vitest.expect)(message).toContain(addr);
|
|
51
|
+
(0, import_vitest.expect)(message).toContain("Chain ID: 1");
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var import_vitest = require("vitest");
|
|
4
|
+
var import_util = require("./util.native.js");
|
|
5
|
+
(0, import_vitest.describe)("getNonce", function () {
|
|
6
|
+
(0, import_vitest.beforeEach)(function () {
|
|
7
|
+
import_vitest.vi.stubGlobal("fetch", import_vitest.vi.fn().mockResolvedValue({
|
|
8
|
+
ok: true,
|
|
9
|
+
text: function text() {
|
|
10
|
+
return Promise.resolve("abc123nonce");
|
|
11
|
+
}
|
|
12
|
+
}));
|
|
13
|
+
});
|
|
14
|
+
(0, import_vitest.afterEach)(function () {
|
|
15
|
+
import_vitest.vi.restoreAllMocks();
|
|
16
|
+
});
|
|
17
|
+
(0, import_vitest.it)("fetches nonce from the keycloak SIWE URL", async function () {
|
|
18
|
+
var nonce = await (0, import_util.getNonce)("https://auth.example.com/siwe");
|
|
19
|
+
(0, import_vitest.expect)(fetch).toHaveBeenCalledWith("https://auth.example.com/siwe/nonce", {
|
|
20
|
+
credentials: "include"
|
|
21
|
+
});
|
|
22
|
+
(0, import_vitest.expect)(nonce).toBe("abc123nonce");
|
|
23
|
+
});
|
|
24
|
+
(0, import_vitest.it)("throws when response is not ok", async function () {
|
|
25
|
+
import_vitest.vi.stubGlobal("fetch", import_vitest.vi.fn().mockResolvedValue({
|
|
26
|
+
ok: false,
|
|
27
|
+
text: function text() {
|
|
28
|
+
return Promise.resolve("");
|
|
29
|
+
}
|
|
30
|
+
}));
|
|
31
|
+
await (0, import_vitest.expect)((0, import_util.getNonce)("https://auth.example.com/siwe")).rejects.toThrow("failed to get nonce");
|
|
32
|
+
});
|
|
33
|
+
(0, import_vitest.it)("throws when response body is empty", async function () {
|
|
34
|
+
import_vitest.vi.stubGlobal("fetch", import_vitest.vi.fn().mockResolvedValue({
|
|
35
|
+
ok: true,
|
|
36
|
+
text: function text() {
|
|
37
|
+
return Promise.resolve("");
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
await (0, import_vitest.expect)((0, import_util.getNonce)("https://auth.example.com/siwe")).rejects.toThrow("failed to get nonce");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
(0, import_vitest.describe)("createMessage", function () {
|
|
44
|
+
(0, import_vitest.it)("throws when window is undefined (non-browser)", async function () {
|
|
45
|
+
var origWindow = globalThis.window;
|
|
46
|
+
delete globalThis.window;
|
|
47
|
+
try {
|
|
48
|
+
await (0, import_vitest.expect)((0, import_util.createMessage)("nonce123", "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", 1)).rejects.toThrow("createMessage requires browser context");
|
|
49
|
+
} finally {
|
|
50
|
+
globalThis.window = origWindow;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
(0, import_vitest.it)("creates a SIWE message using browser location", async function () {
|
|
54
|
+
var addr = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045";
|
|
55
|
+
var message = await (0, import_util.createMessage)("nonce123", addr, 1);
|
|
56
|
+
(0, import_vitest.expect)(message).toContain("Sign in With Ethereum.");
|
|
57
|
+
(0, import_vitest.expect)(message).toContain("nonce123");
|
|
58
|
+
(0, import_vitest.expect)(message).toContain(addr);
|
|
59
|
+
(0, import_vitest.expect)(message).toContain("Chain ID: 1");
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=util.spec.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["import_vitest","require","import_util","describe","beforeEach","vi","stubGlobal","fn","mockResolvedValue","ok","text","Promise","resolve","afterEach","restoreAllMocks","it","nonce","getNonce","expect","fetch","toHaveBeenCalledWith","credentials","toBe","rejects","toThrow","origWindow","globalThis","window","createMessage","addr","message","toContain"],"sources":["../../src/util.spec.ts"],"sourcesContent":[null],"mappings":"AAAA;;AACA,IAAAA,aAAA,GAAwCC,OAAA;AAAA,IAExCC,WAAA,GAAAD,OAAA,mBAAS;AACP,IAAAD,aAAA,CAAAG,QAAA,YAAiB;EACf,IAAAH,aAAA,CAAAI,UAAG;IAAAJ,aACD,CAAAK,EAAA,CAAAC,UAAA,UAAAN,aAAA,CAAAK,EAAA,CAAAE,EAAA,GAAAC,iBAAA;MACAC,EAAA;MAA0BC,IACxB,EAAI,SAAAA,KAAA;QACJ,OAAMC,OAAM,CAAAC,OAAQ,cAAQ;MAC9B;IACF;EACF,CAAC;EAED,IAAAZ,aAAA,CAAAa,SAAA,EAAU,YAAM;IACdb,aAAA,CAAAK,EAAA,CAAGS,eAAA,CAAgB;EACrB,CAAC;EAED,IAAAd,aAAA,CAAAe,EAAA,EAAG,4CAA4C,kBAAY;IACzD,IAAAC,KAAM,SAAQ,IAAAd,WAAM,CAAAe,QAAA,iCAAS;IAC7B,IAAAjB,aAAA,CAAAkB,MAAA,EAAOC,KAAK,EAAEC,oBAAA,CAAqB,uCAAuC;MACxEC,WAAA,EAAa;IACf,CAAC;IACD,IAAArB,aAAA,CAAAkB,MAAA,EAAOF,KAAK,EAAEM,IAAA,CAAK,aAAa;EAClC,CAAC;EAED,IAAAtB,aAAA,CAAAe,EAAA,EAAG,kCAAkC,kBAAY;IAC/Cf,aAAA,CAAAK,EAAA,CAAGC,UAAA,UAAAN,aAAA,CAAAK,EAAA,CAAAE,EAAA,GAAAC,iBAAA;MACDC,EAAA;MACAC,IAAA,WAAAA,IAAGA,CAAA,EAAK;QACN,OAAIC,OAAA,CAAAC,OAAA;MAAA;IAC0B,EAChC,CAAC;IACH,UAAAZ,aAAA,CAAAkB,MAAA,MAAAhB,WAAA,CAAAe,QAAA,oCAAAM,OAAA,CAAAC,OAAA;EACA;EACF,CAAC,GAAAxB,aAAA,CAAAe,EAAA;IAEDf,aAAA,CAAAK,EAAA,CAAAC,UAAG,UAAAN,aAAA,CAAAK,EAAA,CAAAE,EAAA,EAAsC,CAAAC,iBAAY;MACnDC,EAAA;MACEC,IAAA,WAAAA,KAAA;QACA,OAAAC,OAAA,CAAGC,OAAK;MAAkB;IACpB;IAC0B,MAC/B,IAAAZ,aAAA,CAAAkB,MAAA,MAAAhB,WAAA,CAAAe,QAAA,oCAAAM,OAAA,CAAAC,OAAA;EAAA,EACH;AACA;AAA6F,EAC/F,EAACxB,aAAA,CAAAG,QAAA;EACF,IAAAH,aAAA,CAAAe,EAAA;IAED,IAAAU,UAAA,GAAAC,UAAS,CAAAC,MAAA;IACP,OAAAD,UAAA,CAAAC,MAAG;IACD;MAEA,MAAO,IAAA3B,aAAW,CAAAkB,MAAA,MAAAhB,WAAA,CAAA0B,aAAA,gEAAAL,OAAA,CAAAC,OAAA;IAClB,UAAI;MACFE,UAAM,CAAAC,MAAA,GAAAF,UAAA;IAAA;EACqE;EACjB,EAC5D,EAAAzB,aAAE,CAAAe,EAAA;IACA,IAAAc,IAAA,+CAAoB;IACtB,IAAAC,OAAA,aAAA5B,WAAA,CAAA0B,aAAA,cAAAC,IAAA;IACD,IAAA7B,aAAA,CAAAkB,MAAA,EAAAY,OAAA,EAAAC,SAAA;IAED,IAAA/B,aAAA,CAAAkB,MAAG,EAAAY,OAAA,EAAAC,SAAA;IACD,IAAA/B,aAAa,CAAAkB,MAAA,EAAAY,OAAA,EAAAC,SAAA,CAAAF,IAAA;IACb,IAAA7B,aAAgB,CAAAkB,MAAA,EAAMY,OAAA,EAAAC,SAAA,cAAc;EACpC;AACA","ignoreList":[]}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import Keycloak from "@multiplatform.one/keycloak-js";
|
|
2
|
+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
3
|
+
import { ConnectKitProvider, SIWEProvider, createWalletMessage, getDefaultConfig } from "@multiplatform.one/web3/connectkit";
|
|
4
|
+
import { useMemo } from "react";
|
|
5
|
+
import { WagmiProvider, createConfig } from "wagmi";
|
|
6
|
+
import { arbitrum, mainnet, optimism, polygon } from "wagmi/chains";
|
|
7
|
+
import { storage } from "@multiplatform.one/store";
|
|
8
|
+
import { SiweKeycloakContext } from "./hooks/context.mjs";
|
|
9
|
+
import { encodeBase64 } from "./base64.mjs";
|
|
10
|
+
import { getNonce } from "./util.mjs";
|
|
11
|
+
import { jsx } from "react/jsx-runtime";
|
|
12
|
+
const queryClient = new QueryClient();
|
|
13
|
+
const logger = console;
|
|
14
|
+
const ACCESS_TOKEN_KEY = "KEYCLOAK_TOKEN";
|
|
15
|
+
const ID_TOKEN_KEY = "KEYCLOAK_ID_TOKEN";
|
|
16
|
+
const REFRESH_TOKEN_KEY = "KEYCLOAK_REFRESH_TOKEN";
|
|
17
|
+
function SiweKeycloakProvider({
|
|
18
|
+
children,
|
|
19
|
+
clearTokens: clearTokensProp,
|
|
20
|
+
debug,
|
|
21
|
+
getTokens: getTokensProp,
|
|
22
|
+
keycloak: keycloakProp,
|
|
23
|
+
siwe,
|
|
24
|
+
setTokens: setTokensProp,
|
|
25
|
+
wagmi: wagmiProp,
|
|
26
|
+
onSignedIn,
|
|
27
|
+
onSignedInFailed,
|
|
28
|
+
...props
|
|
29
|
+
}) {
|
|
30
|
+
const keycloakConfig = useMemo(() => ({
|
|
31
|
+
...keycloakProp,
|
|
32
|
+
...(typeof keycloakProp?.baseUrl !== "undefined" ? {
|
|
33
|
+
baseUrl: keycloakProp.baseUrl
|
|
34
|
+
} : {
|
|
35
|
+
baseUrl: "http://localhost:8080"
|
|
36
|
+
}),
|
|
37
|
+
...(typeof keycloakProp?.clientId !== "undefined" ? {
|
|
38
|
+
clientId: keycloakProp.clientId
|
|
39
|
+
} : {
|
|
40
|
+
clientId: "app"
|
|
41
|
+
}),
|
|
42
|
+
...(typeof keycloakProp?.realm !== "undefined" ? {
|
|
43
|
+
realm: keycloakProp.realm
|
|
44
|
+
} : {
|
|
45
|
+
realm: "main"
|
|
46
|
+
}),
|
|
47
|
+
...(typeof keycloakProp?.scope !== "undefined" ? {
|
|
48
|
+
scope: keycloakProp.scope
|
|
49
|
+
} : {
|
|
50
|
+
scope: []
|
|
51
|
+
})
|
|
52
|
+
}), [keycloakProp]);
|
|
53
|
+
const keycloak = useMemo(() => typeof window !== "undefined" ? new Keycloak({
|
|
54
|
+
clientId: keycloakConfig.clientId,
|
|
55
|
+
realm: keycloakConfig.realm,
|
|
56
|
+
url: keycloakConfig.baseUrl
|
|
57
|
+
}) : void 0, [keycloakConfig]);
|
|
58
|
+
const clearTokens = useMemo(() => clearTokensProp || (async () => {
|
|
59
|
+
await Promise.resolve(storage.removeItem(ID_TOKEN_KEY));
|
|
60
|
+
await Promise.resolve(storage.removeItem(REFRESH_TOKEN_KEY));
|
|
61
|
+
await Promise.resolve(storage.removeItem(ACCESS_TOKEN_KEY));
|
|
62
|
+
}), [clearTokensProp]);
|
|
63
|
+
const setTokens = useMemo(() => setTokensProp || (async ({
|
|
64
|
+
accessToken,
|
|
65
|
+
refreshToken,
|
|
66
|
+
idToken
|
|
67
|
+
}) => {
|
|
68
|
+
await Promise.resolve(storage.setItem(ID_TOKEN_KEY, idToken));
|
|
69
|
+
await Promise.resolve(storage.setItem(REFRESH_TOKEN_KEY, refreshToken));
|
|
70
|
+
await Promise.resolve(storage.setItem(ACCESS_TOKEN_KEY, accessToken));
|
|
71
|
+
}), [setTokensProp]);
|
|
72
|
+
const getTokens = useMemo(() => getTokensProp || (async () => ({
|
|
73
|
+
accessToken: (await Promise.resolve(storage.getItem(ACCESS_TOKEN_KEY))) || "",
|
|
74
|
+
idToken: (await Promise.resolve(storage.getItem(ID_TOKEN_KEY))) || "",
|
|
75
|
+
refreshToken: (await Promise.resolve(storage.getItem(REFRESH_TOKEN_KEY))) || ""
|
|
76
|
+
})), [getTokensProp]);
|
|
77
|
+
const keycloakRealmUrl = useMemo(() => `${keycloakConfig.baseUrl}/realms/${keycloakConfig.realm || "main"}`, [keycloakConfig]);
|
|
78
|
+
const keycloakSiweUrl = useMemo(() => `${keycloakRealmUrl}/siwe`, [keycloakRealmUrl]);
|
|
79
|
+
const config = useMemo(() => createConfig(getDefaultConfig({
|
|
80
|
+
appName: "Example",
|
|
81
|
+
chains: [mainnet, polygon, optimism, arbitrum],
|
|
82
|
+
walletConnectProjectId: props.appName || "Example",
|
|
83
|
+
...props,
|
|
84
|
+
...wagmiProp
|
|
85
|
+
})), [props, wagmiProp]);
|
|
86
|
+
const siweConfig = useMemo(() => {
|
|
87
|
+
const siweConfig2 = {
|
|
88
|
+
getNonce: async () => getNonce(keycloakSiweUrl),
|
|
89
|
+
// Chain-agnostic: derives the signer family from the active connector's
|
|
90
|
+
// (possibly synthetic) chainId and builds the matching SIWx message, so EVM
|
|
91
|
+
// and Solana/Sui/Bitcoin all sign in through ConnectKit's one signIn().
|
|
92
|
+
createMessage({
|
|
93
|
+
nonce,
|
|
94
|
+
address,
|
|
95
|
+
chainId
|
|
96
|
+
}) {
|
|
97
|
+
return createWalletMessage({
|
|
98
|
+
address,
|
|
99
|
+
chainId,
|
|
100
|
+
nonce
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
async verifyMessage({
|
|
104
|
+
message,
|
|
105
|
+
signature
|
|
106
|
+
}) {
|
|
107
|
+
const formData = new URLSearchParams({
|
|
108
|
+
client_id: keycloakConfig.clientId,
|
|
109
|
+
grant_type: "password",
|
|
110
|
+
password: encodeBase64(message),
|
|
111
|
+
username: signature,
|
|
112
|
+
scope: ["openid", [...(Array.isArray(keycloakConfig.scope) ? keycloakConfig.scope : keycloakConfig.scope ? [keycloakConfig.scope] : [])]].join(" ")
|
|
113
|
+
});
|
|
114
|
+
const res = await fetch(`${keycloakRealmUrl}/protocol/openid-connect/token`, {
|
|
115
|
+
method: "POST",
|
|
116
|
+
credentials: "include",
|
|
117
|
+
headers: {
|
|
118
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
119
|
+
},
|
|
120
|
+
body: formData
|
|
121
|
+
});
|
|
122
|
+
if (!res.ok) {
|
|
123
|
+
const error = new Error(`sign in failed with status ${res.status}`);
|
|
124
|
+
logger.warn(error);
|
|
125
|
+
onSignedInFailed?.(error);
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
const data = await res.json();
|
|
129
|
+
if (!data.access_token || !data.id_token || !data.refresh_token) {
|
|
130
|
+
const error = new Error(`missing tokens ${[!data.access_token && "access_token", !data.id_token && "id_token", !data.refresh_token && "refresh_token"].filter(Boolean).reduce((acc, curr, i, arr) => {
|
|
131
|
+
if (i === 0) return curr;
|
|
132
|
+
if (i === arr.length - 1) return `${acc} and ${curr}`;
|
|
133
|
+
return `${acc}, ${curr}`;
|
|
134
|
+
}, "")}`);
|
|
135
|
+
logger.warn(error);
|
|
136
|
+
onSignedInFailed?.(error);
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
await Promise.resolve(setTokens({
|
|
140
|
+
accessToken: data.access_token,
|
|
141
|
+
idToken: data.id_token,
|
|
142
|
+
refreshToken: data.refresh_token
|
|
143
|
+
}));
|
|
144
|
+
onSignedIn?.();
|
|
145
|
+
return true;
|
|
146
|
+
},
|
|
147
|
+
async getSession() {
|
|
148
|
+
if (!keycloak) return null;
|
|
149
|
+
const {
|
|
150
|
+
accessToken,
|
|
151
|
+
refreshToken,
|
|
152
|
+
idToken
|
|
153
|
+
} = await Promise.resolve(getTokens());
|
|
154
|
+
await keycloak.init({
|
|
155
|
+
checkLoginIframe: false,
|
|
156
|
+
flow: "implicit",
|
|
157
|
+
idToken,
|
|
158
|
+
onLoad: void 0,
|
|
159
|
+
refreshToken,
|
|
160
|
+
timeSkew: 0,
|
|
161
|
+
token: accessToken
|
|
162
|
+
});
|
|
163
|
+
if (keycloak.token !== accessToken || keycloak.refreshToken !== refreshToken || keycloak.idToken !== idToken) {
|
|
164
|
+
await Promise.resolve(setTokens({
|
|
165
|
+
accessToken: keycloak.token || accessToken,
|
|
166
|
+
idToken: keycloak.idToken || idToken,
|
|
167
|
+
refreshToken: keycloak.refreshToken || refreshToken
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const res = await fetch(`${keycloakSiweUrl}/session`, {
|
|
172
|
+
headers: {
|
|
173
|
+
Authorization: `Bearer ${keycloak.token}`
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
if (res.ok) return res.json();
|
|
177
|
+
if (res.status === 401) return null;
|
|
178
|
+
throw new Error("Failed to get session");
|
|
179
|
+
} catch (err) {
|
|
180
|
+
if (err instanceof Error && err.message === "Failed to get session") {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
throw err;
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
async signOut() {
|
|
187
|
+
if (!keycloak) return false;
|
|
188
|
+
keycloak.idToken = void 0;
|
|
189
|
+
keycloak.refreshToken = void 0;
|
|
190
|
+
keycloak.token = void 0;
|
|
191
|
+
await Promise.resolve(clearTokens());
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
return siweConfig2;
|
|
196
|
+
}, [keycloakRealmUrl, keycloakSiweUrl, keycloakConfig]);
|
|
197
|
+
if (siwe) {
|
|
198
|
+
return /* @__PURE__ */jsx(WagmiProvider, {
|
|
199
|
+
config,
|
|
200
|
+
children: /* @__PURE__ */jsx(QueryClientProvider, {
|
|
201
|
+
client: queryClient,
|
|
202
|
+
children: /* @__PURE__ */jsx(SIWEProvider, {
|
|
203
|
+
signOutOnAccountChange: false,
|
|
204
|
+
signOutOnDisconnect: false,
|
|
205
|
+
signOutOnNetworkChange: false,
|
|
206
|
+
...siweConfig,
|
|
207
|
+
children: /* @__PURE__ */jsx(ConnectKitProvider, {
|
|
208
|
+
debugMode: debug,
|
|
209
|
+
children: /* @__PURE__ */jsx(SiweKeycloakContext.Provider, {
|
|
210
|
+
value: {
|
|
211
|
+
keycloak
|
|
212
|
+
},
|
|
213
|
+
children
|
|
214
|
+
})
|
|
215
|
+
})
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return /* @__PURE__ */jsx(WagmiProvider, {
|
|
221
|
+
config,
|
|
222
|
+
children: /* @__PURE__ */jsx(QueryClientProvider, {
|
|
223
|
+
client: queryClient,
|
|
224
|
+
children: /* @__PURE__ */jsx(ConnectKitProvider, {
|
|
225
|
+
debugMode: debug,
|
|
226
|
+
children: /* @__PURE__ */jsx(SiweKeycloakContext.Provider, {
|
|
227
|
+
value: {
|
|
228
|
+
keycloak
|
|
229
|
+
},
|
|
230
|
+
children
|
|
231
|
+
})
|
|
232
|
+
})
|
|
233
|
+
})
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
export { SiweKeycloakProvider };
|
|
237
|
+
//# sourceMappingURL=SiweKeycloakProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Keycloak","QueryClient","QueryClientProvider","ConnectKitProvider","SIWEProvider","createWalletMessage","getDefaultConfig","useMemo","WagmiProvider","createConfig","arbitrum","mainnet","optimism","polygon","storage","SiweKeycloakContext","encodeBase64","getNonce","jsx","queryClient","logger","console","ACCESS_TOKEN_KEY","ID_TOKEN_KEY","REFRESH_TOKEN_KEY","SiweKeycloakProvider","children","clearTokens","clearTokensProp","debug","getTokens","getTokensProp","keycloak","keycloakProp","siwe","setTokens","setTokensProp","wagmi","wagmiProp","onSignedIn","onSignedInFailed","props","keycloakConfig","baseUrl","clientId","realm","scope","window","url","Promise","resolve","removeItem","accessToken","refreshToken","idToken","setItem","getItem","keycloakRealmUrl","keycloakSiweUrl","config","appName","chains","walletConnectProjectId","siweConfig","createMessage","nonce","address","chainId","verifyMessage","message","signature","formData","URLSearchParams","client_id","grant_type","password","username","Array","isArray","join","res","fetch","method","credentials","headers","body","ok","error","Error","status","warn","data","json","access_token","id_token","refresh_token","filter","Boolean","reduce","acc","curr","i","arr","length","getSession","init","checkLoginIframe","flow","onLoad","timeSkew","token","Authorization","err","signOut","client","signOutOnAccountChange","signOutOnDisconnect","signOutOnNetworkChange","debugMode","Provider","value"],"sources":["../../src/SiweKeycloakProvider.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|