@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.
Files changed (155) hide show
  1. package/README.md +8 -0
  2. package/dist/cjs/SiweKeycloakProvider.cjs +273 -0
  3. package/dist/cjs/SiweKeycloakProvider.native.js +309 -0
  4. package/dist/cjs/SiweKeycloakProvider.native.js.map +1 -0
  5. package/dist/cjs/base64.cjs +51 -0
  6. package/dist/cjs/base64.native.js +55 -0
  7. package/dist/cjs/base64.native.js.map +1 -0
  8. package/dist/cjs/base64.spec.cjs +57 -0
  9. package/dist/cjs/base64.spec.native.js +79 -0
  10. package/dist/cjs/base64.spec.native.js.map +1 -0
  11. package/dist/cjs/context.cjs +29 -0
  12. package/dist/cjs/context.native.js +32 -0
  13. package/dist/cjs/context.native.js.map +1 -0
  14. package/dist/cjs/hooks/context.cjs +29 -0
  15. package/dist/cjs/hooks/context.native.js +32 -0
  16. package/dist/cjs/hooks/context.native.js.map +1 -0
  17. package/dist/cjs/hooks/index.cjs +20 -0
  18. package/dist/cjs/hooks/index.native.js +23 -0
  19. package/dist/cjs/hooks/index.native.js.map +1 -0
  20. package/dist/cjs/hooks/useSiweKeycloak.cjs +61 -0
  21. package/dist/cjs/hooks/useSiweKeycloak.native.js +64 -0
  22. package/dist/cjs/hooks/useSiweKeycloak.native.js.map +1 -0
  23. package/dist/cjs/index.cjs +133 -0
  24. package/dist/cjs/index.native.js +189 -0
  25. package/dist/cjs/index.native.js.map +1 -0
  26. package/dist/cjs/render.cjs +78 -0
  27. package/dist/cjs/render.native.js +82 -0
  28. package/dist/cjs/render.native.js.map +1 -0
  29. package/dist/cjs/siwe.cjs +76 -0
  30. package/dist/cjs/siwe.native.js +94 -0
  31. package/dist/cjs/siwe.native.js.map +1 -0
  32. package/dist/cjs/types.cjs +18 -0
  33. package/dist/cjs/types.native.js +21 -0
  34. package/dist/cjs/types.native.js.map +1 -0
  35. package/dist/cjs/util.cjs +53 -0
  36. package/dist/cjs/util.native.js +56 -0
  37. package/dist/cjs/util.native.js.map +1 -0
  38. package/dist/cjs/util.spec.cjs +53 -0
  39. package/dist/cjs/util.spec.native.js +62 -0
  40. package/dist/cjs/util.spec.native.js.map +1 -0
  41. package/dist/esm/SiweKeycloakProvider.mjs +237 -0
  42. package/dist/esm/SiweKeycloakProvider.mjs.map +1 -0
  43. package/dist/esm/SiweKeycloakProvider.native.js +270 -0
  44. package/dist/esm/SiweKeycloakProvider.native.js.map +1 -0
  45. package/dist/esm/base64.mjs +26 -0
  46. package/dist/esm/base64.mjs.map +1 -0
  47. package/dist/esm/base64.native.js +27 -0
  48. package/dist/esm/base64.native.js.map +1 -0
  49. package/dist/esm/base64.spec.mjs +58 -0
  50. package/dist/esm/base64.spec.mjs.map +1 -0
  51. package/dist/esm/base64.spec.native.js +77 -0
  52. package/dist/esm/base64.spec.native.js.map +1 -0
  53. package/dist/esm/context.mjs +4 -0
  54. package/dist/esm/context.mjs.map +1 -0
  55. package/dist/esm/context.native.js +4 -0
  56. package/dist/esm/context.native.js.map +1 -0
  57. package/dist/esm/hooks/context.mjs +4 -0
  58. package/dist/esm/hooks/context.mjs.map +1 -0
  59. package/dist/esm/hooks/context.native.js +4 -0
  60. package/dist/esm/hooks/context.native.js.map +1 -0
  61. package/dist/esm/hooks/index.mjs +2 -0
  62. package/dist/esm/hooks/index.mjs.map +1 -0
  63. package/dist/esm/hooks/index.native.js +2 -0
  64. package/dist/esm/hooks/index.native.js.map +1 -0
  65. package/dist/esm/hooks/useSiweKeycloak.mjs +36 -0
  66. package/dist/esm/hooks/useSiweKeycloak.mjs.map +1 -0
  67. package/dist/esm/hooks/useSiweKeycloak.native.js +36 -0
  68. package/dist/esm/hooks/useSiweKeycloak.native.js.map +1 -0
  69. package/dist/esm/index.mjs +107 -0
  70. package/dist/esm/index.mjs.map +1 -0
  71. package/dist/esm/index.native.js +160 -0
  72. package/dist/esm/index.native.js.map +1 -0
  73. package/dist/esm/render.mjs +42 -0
  74. package/dist/esm/render.mjs.map +1 -0
  75. package/dist/esm/render.native.js +43 -0
  76. package/dist/esm/render.native.js.map +1 -0
  77. package/dist/esm/siwe.mjs +51 -0
  78. package/dist/esm/siwe.mjs.map +1 -0
  79. package/dist/esm/siwe.native.js +66 -0
  80. package/dist/esm/siwe.native.js.map +1 -0
  81. package/dist/esm/types.mjs +2 -0
  82. package/dist/esm/types.mjs.map +1 -0
  83. package/dist/esm/types.native.js +2 -0
  84. package/dist/esm/types.native.js.map +1 -0
  85. package/dist/esm/util.mjs +27 -0
  86. package/dist/esm/util.mjs.map +1 -0
  87. package/dist/esm/util.native.js +27 -0
  88. package/dist/esm/util.native.js.map +1 -0
  89. package/dist/esm/util.spec.mjs +54 -0
  90. package/dist/esm/util.spec.mjs.map +1 -0
  91. package/dist/esm/util.spec.native.js +60 -0
  92. package/dist/esm/util.spec.native.js.map +1 -0
  93. package/package.json +81 -0
  94. package/src/SiweKeycloakProvider.tsx +297 -0
  95. package/src/base64.spec.ts +65 -0
  96. package/src/base64.ts +26 -0
  97. package/src/context.ts +10 -0
  98. package/src/hooks/context.ts +10 -0
  99. package/src/hooks/index.ts +1 -0
  100. package/src/hooks/useSiweKeycloak.ts +23 -0
  101. package/src/index.ts +127 -0
  102. package/src/main/java/com/bitspur/keycloak/siwe/Errors.java +21 -0
  103. package/src/main/java/com/bitspur/keycloak/siwe/LiteAuthenticationService.java +167 -0
  104. package/src/main/java/com/bitspur/keycloak/siwe/SiweCredentials.java +36 -0
  105. package/src/main/java/com/bitspur/keycloak/siwe/SiweSession.java +36 -0
  106. package/src/main/java/com/bitspur/keycloak/siwe/SiweUtil.java +599 -0
  107. package/src/main/java/com/bitspur/keycloak/siwe/Token.java +85 -0
  108. package/src/main/java/com/bitspur/keycloak/siwe/authenticators/browser/SiweBrowserAuthenticator.java +109 -0
  109. package/src/main/java/com/bitspur/keycloak/siwe/authenticators/browser/SiweBrowserAuthenticatorFactory.java +93 -0
  110. package/src/main/java/com/bitspur/keycloak/siwe/authenticators/directgrant/SiweDirectGrantAuthenticator.java +153 -0
  111. package/src/main/java/com/bitspur/keycloak/siwe/authenticators/directgrant/SiweDirectGrantAuthenticatorFactory.java +93 -0
  112. package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonce.java +95 -0
  113. package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonceJpaEntityProvider.java +82 -0
  114. package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonceJpaEntityProviderFactory.java +46 -0
  115. package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletAddress.java +103 -0
  116. package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletJpaEntityProvider.java +43 -0
  117. package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletJpaEntityProviderFactory.java +46 -0
  118. package/src/main/java/com/bitspur/keycloak/siwe/protocol/SiweWalletProtocolMapper.java +85 -0
  119. package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResource.java +210 -0
  120. package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResourceProvider.java +34 -0
  121. package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResourceProviderFactory.java +46 -0
  122. package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuCredentials.java +52 -0
  123. package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuMessage.java +362 -0
  124. package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuParseException.java +23 -0
  125. package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuUtil.java +547 -0
  126. package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/browser/SiuBrowserAuthenticator.java +112 -0
  127. package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/browser/SiuBrowserAuthenticatorFactory.java +96 -0
  128. package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/directgrant/SiuDirectGrantAuthenticator.java +169 -0
  129. package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/directgrant/SiuDirectGrantAuthenticatorFactory.java +96 -0
  130. package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResource.java +244 -0
  131. package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResourceProvider.java +34 -0
  132. package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResourceProviderFactory.java +48 -0
  133. package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsCredentials.java +52 -0
  134. package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsMessage.java +362 -0
  135. package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsParseException.java +23 -0
  136. package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsUtil.java +564 -0
  137. package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/browser/SiwsBrowserAuthenticator.java +112 -0
  138. package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/browser/SiwsBrowserAuthenticatorFactory.java +96 -0
  139. package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/directgrant/SiwsDirectGrantAuthenticator.java +169 -0
  140. package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/directgrant/SiwsDirectGrantAuthenticatorFactory.java +96 -0
  141. package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResource.java +244 -0
  142. package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResourceProvider.java +34 -0
  143. package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResourceProviderFactory.java +48 -0
  144. package/src/main/resources/META-INF/keycloak-themes.json +8 -0
  145. package/src/main/resources/META-INF/services/org.keycloak.authentication.AuthenticatorFactory +6 -0
  146. package/src/main/resources/META-INF/services/org.keycloak.connections.jpa.entityprovider.JpaEntityProviderFactory +2 -0
  147. package/src/main/resources/META-INF/services/org.keycloak.protocol.ProtocolMapper +1 -0
  148. package/src/main/resources/META-INF/services/org.keycloak.services.resource.RealmResourceProviderFactory +3 -0
  149. package/src/main/resources/META-INF/siwe-nonce-changelog.xml +29 -0
  150. package/src/main/resources/META-INF/siwe-wallet-changelog.xml +46 -0
  151. package/src/render.tsx +47 -0
  152. package/src/siwe.tsx +57 -0
  153. package/src/types.ts +6 -0
  154. package/src/util.spec.ts +72 -0
  155. package/src/util.ts +28 -0
@@ -0,0 +1,23 @@
1
+ import { useModal, useSIWE } from "@multiplatform.one/web3/connectkit";
2
+ import { useContext } from "react";
3
+ import { useAccount } from "wagmi";
4
+ import { SiweKeycloakContext } from "./context";
5
+
6
+ export function useSiweKeycloak() {
7
+ const { addresses } = useAccount();
8
+ const { signOut } = useSIWE();
9
+ const { openSIWE, openSwitchNetworks, openOnboarding, openAbout, openProfile } = useModal();
10
+ const { keycloak } = useContext(SiweKeycloakContext);
11
+ return {
12
+ signOut,
13
+ openSIWE,
14
+ openSwitchNetworks,
15
+ openOnboarding,
16
+ openAbout,
17
+ openProfile,
18
+ keycloak,
19
+ connect() {
20
+ if (!addresses?.length) openProfile();
21
+ },
22
+ };
23
+ }
package/src/index.ts ADDED
@@ -0,0 +1,127 @@
1
+ import type { GetWalletClientData } from "@wagmi/core/query";
2
+ import type { Address } from "viem";
3
+ import type { UseClientReturnType } from "wagmi";
4
+ import type { RenderOptions } from "./render";
5
+ import { render } from "./render";
6
+ import type { KeycloakConfig } from "./types";
7
+ import { createMessage, getNonce } from "./util";
8
+ export interface SiweKeycloakOptions extends RenderOptions {}
9
+
10
+ export class SiweKeycloak {
11
+ private _walletClientResolvers: ((value: null) => void)[] = [];
12
+
13
+ addresses: readonly [Address, ...Address[]] | readonly Address[] = [];
14
+ client?: UseClientReturnType;
15
+ connect?: () => Promise<void>;
16
+ keycloakConfig: KeycloakConfig;
17
+ openAbout?: () => any;
18
+ openOnboarding?: () => any;
19
+ openProfile?: () => Promise<void>;
20
+ openSIWE?: () => Promise<void>;
21
+ openSwitchNetworks?: () => any;
22
+ signOut?: () => any;
23
+ walletClient?: GetWalletClientData<any, any>;
24
+
25
+ constructor(
26
+ options?: Omit<
27
+ SiweKeycloakOptions,
28
+ | "onSetClient"
29
+ | "onSetConnect"
30
+ | "onSetOpenAbout"
31
+ | "onSetOpenOnboarding"
32
+ | "onSetOpenProfile"
33
+ | "onSetOpenSIWE"
34
+ | "onSetOpenSwitchNetworks"
35
+ | "onSetSignOut"
36
+ | "onSetWalletClient"
37
+ >,
38
+ ) {
39
+ render({
40
+ ...options,
41
+ onAddresses: (addresses) => {
42
+ this.addresses = addresses;
43
+ if (!addresses.length) this.walletClient = undefined;
44
+ options?.onAddresses?.(addresses);
45
+ },
46
+ onSetOpenAbout: (openAbout) => {
47
+ this.openAbout = openAbout;
48
+ },
49
+ onSetOpenOnboarding: (openOnboarding) => {
50
+ this.openOnboarding = openOnboarding;
51
+ },
52
+ onSetOpenProfile: (openProfile) => {
53
+ this.openProfile = this._asyncTrigger(openProfile);
54
+ },
55
+ onSetOpenSIWE: (openSIWE) => {
56
+ this.openSIWE = this._asyncTrigger(openSIWE);
57
+ },
58
+ onSetConnect: (connect) => {
59
+ this.connect = this._asyncTrigger(connect);
60
+ },
61
+ onSetOpenSwitchNetworks: (openSwitchNetworks) => {
62
+ this.openSwitchNetworks = openSwitchNetworks;
63
+ },
64
+ onSetSignOut: (signOut) => {
65
+ this.signOut = signOut;
66
+ },
67
+ onSetClient: (client) => {
68
+ this.client = client;
69
+ },
70
+ onSetWalletClient: (walletClient) => {
71
+ this.walletClient = walletClient;
72
+ if (walletClient) {
73
+ this._walletClientResolvers.forEach((resolve) => resolve(null));
74
+ this._walletClientResolvers = [];
75
+ }
76
+ },
77
+ });
78
+ this.keycloakConfig = {
79
+ ...options?.keycloak,
80
+ ...(typeof options?.keycloak?.baseUrl !== "undefined"
81
+ ? { baseUrl: options?.keycloak?.baseUrl }
82
+ : {
83
+ baseUrl: "http://localhost:8080",
84
+ }),
85
+ ...(typeof options?.keycloak?.clientId !== "undefined"
86
+ ? { clientId: options?.keycloak?.clientId }
87
+ : { clientId: "app" }),
88
+ ...(typeof options?.keycloak?.realm !== "undefined"
89
+ ? { realm: options?.keycloak?.realm }
90
+ : { realm: "main" }),
91
+ ...(typeof options?.keycloak?.scope !== "undefined"
92
+ ? { scope: options?.keycloak?.scope }
93
+ : { scope: [] }),
94
+ };
95
+ }
96
+
97
+ private _asyncTrigger(trigger: (...args: any[]) => void) {
98
+ return async (...args: any[]) => {
99
+ await new Promise((resolve, reject) => {
100
+ try {
101
+ this._walletClientResolvers.push(resolve);
102
+ trigger(...args);
103
+ if (this.walletClient) return resolve(null);
104
+ } catch (err) {
105
+ reject(err);
106
+ }
107
+ });
108
+ };
109
+ }
110
+
111
+ async getNonce() {
112
+ return getNonce(
113
+ `${this.keycloakConfig.baseUrl}/realms/${this.keycloakConfig.realm || "main"}/siwe`,
114
+ );
115
+ }
116
+
117
+ async createMessage(address: Address) {
118
+ if (!this.client?.chain.id) return;
119
+ const nonce = await this.getNonce();
120
+ return createMessage(nonce, address, this.client.chain.id);
121
+ }
122
+ }
123
+
124
+ export * from "./SiweKeycloakProvider";
125
+ export * from "./hooks";
126
+ export * from "./types";
127
+ export * from "./util";
@@ -0,0 +1,21 @@
1
+ /**
2
+ * File: /src/main/java/com/bitspur/keycloak/siwe/Errors.java
3
+ * Project: authenticators
4
+ * File Created: 26-03-2022 13:20:05
5
+ * Author: Clay Risser
6
+ * -----
7
+ * Last Modified: 10-08-2023 16:34:52
8
+ * Modified By: Clay Risser
9
+ * -----
10
+ * BitSpur (c) Copyright 2022
11
+ */
12
+
13
+ package com.bitspur.keycloak.siwe;
14
+
15
+ public class Errors {
16
+ public static final class SiweKeycloakException extends Exception {
17
+ public SiweKeycloakException(String msg) {
18
+ super(msg);
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,167 @@
1
+ /**
2
+ * File: /src/main/java/com/bitspur/keycloak/siwe/LiteAuthenticationService.java
3
+ * Project: @risserlabs/keycloak-avatar-client
4
+ * File Created: 04-08-2022 13:44:07
5
+ * Author: Clay Risser
6
+ * -----
7
+ * Last Modified: 12-02-2024 12:47:58
8
+ * Modified By: Clay Risser
9
+ * -----
10
+ * BitSpur (c) Copyright 2022
11
+ */
12
+
13
+ package com.bitspur.keycloak.siwe;
14
+
15
+ import jakarta.ws.rs.core.HttpHeaders;
16
+
17
+ import org.jboss.logging.Logger;
18
+ import org.keycloak.TokenVerifier;
19
+ import org.keycloak.common.ClientConnection;
20
+ import org.keycloak.common.VerificationException;
21
+ import org.keycloak.common.constants.ServiceAccountConstants;
22
+ import org.keycloak.crypto.SignatureProvider;
23
+ import org.keycloak.crypto.SignatureVerifierContext;
24
+ import org.keycloak.models.AuthenticatedClientSessionModel;
25
+ import org.keycloak.models.ClientModel;
26
+ import org.keycloak.models.KeycloakSession;
27
+ import org.keycloak.models.RealmModel;
28
+ import org.keycloak.models.UserModel;
29
+ import org.keycloak.models.UserSessionModel;
30
+ import org.keycloak.models.utils.KeycloakModelUtils;
31
+ import org.keycloak.protocol.oidc.OIDCLoginProtocol;
32
+ import org.keycloak.protocol.oidc.TokenManager.NotBeforeCheck;
33
+ import org.keycloak.protocol.oidc.TokenManager;
34
+ import org.keycloak.representations.AccessToken;
35
+ import org.keycloak.services.Urls;
36
+ import org.keycloak.services.managers.AppAuthManager;
37
+ import org.keycloak.services.managers.AuthenticationManager.AuthResult;
38
+ import org.keycloak.services.managers.AuthenticationManager;
39
+ import org.keycloak.services.managers.UserSessionCrossDCManager;
40
+ import org.keycloak.sessions.AuthenticationSessionModel;
41
+ import org.keycloak.sessions.RootAuthenticationSessionModel;
42
+
43
+ public class LiteAuthenticationService {
44
+ private KeycloakSession session;
45
+ private AppAuthManager appAuthManager;
46
+ private Logger logger = Logger.getLogger(LiteAuthenticationService.class);
47
+
48
+ public LiteAuthenticationService(KeycloakSession session) {
49
+ this.session = session;
50
+ this.appAuthManager = new AppAuthManager();
51
+ }
52
+
53
+ public AuthResult resolveAuthentication(HttpHeaders headers, ClientConnection clientConnection) {
54
+ RealmModel realm = session.getContext().getRealm();
55
+ AuthResult authResult = this.appAuthManager.authenticateIdentityCookie(session,
56
+ realm);
57
+ if (authResult != null) {
58
+ return authResult;
59
+ }
60
+ AppAuthManager.AuthHeader authHeader = AppAuthManager.extractAuthorizationHeaderTokenOrReturnNull(headers);
61
+ if (authHeader == null) {
62
+ return null;
63
+ }
64
+ String accessToken = authHeader.getToken();
65
+ AccessToken token;
66
+ ClientModel client;
67
+ try {
68
+ TokenVerifier<AccessToken> verifier = TokenVerifier.create(accessToken, AccessToken.class).withDefaultChecks()
69
+ .realmUrl(Urls.realmIssuer(session.getContext().getUri().getBaseUri(), realm.getName()));
70
+ SignatureVerifierContext verifierContext = session
71
+ .getProvider(SignatureProvider.class, verifier.getHeader().getAlgorithm().name())
72
+ .verifier(verifier.getHeader().getKeyId());
73
+ verifier.verifierContext(verifierContext);
74
+ token = verifier.verify().getToken();
75
+ if (token == null) {
76
+ return null;
77
+ }
78
+ try {
79
+ client = realm.getClientByClientId(token.getIssuedFor());
80
+ } catch (Exception e) {
81
+ logger.error(e);
82
+ return null;
83
+ }
84
+ if (client == null) {
85
+ return null;
86
+ }
87
+ TokenVerifier.createWithoutSignature(token)
88
+ .withChecks(NotBeforeCheck.forModel(client), new TokenManager.TokenRevocationCheck(session))
89
+ .verify();
90
+ } catch (VerificationException e) {
91
+ return null;
92
+ }
93
+ session.getContext().setClient(client);
94
+ if (!client.isEnabled()) {
95
+ return null;
96
+ }
97
+ UserSessionModel userSession = findValidSession(token, client, clientConnection);
98
+ if (userSession == null) {
99
+ return null;
100
+ }
101
+ UserModel user = userSession.getUser();
102
+ if (user == null) {
103
+ return null;
104
+ }
105
+ return new AuthResult(user, userSession, token, client);
106
+ }
107
+
108
+ private UserSessionModel findValidSession(AccessToken token, ClientModel clientModel,
109
+ ClientConnection clientConnection) {
110
+ RealmModel realm = session.getContext().getRealm();
111
+ if (token.getSessionState() == null) {
112
+ return createTransientSessionForClient(token, clientModel, clientConnection);
113
+ }
114
+ UserSessionModel userSession = new UserSessionCrossDCManager(session).getUserSessionWithClient(realm,
115
+ token.getSessionState(), false, clientModel.getId());
116
+ UserSessionModel offlineUserSession = null;
117
+ if (AuthenticationManager.isSessionValid(realm, userSession)) {
118
+ if (!checkTokenIssuedAt(token, userSession, clientModel)) {
119
+ return null;
120
+ }
121
+ return userSession;
122
+ } else {
123
+ offlineUserSession = new UserSessionCrossDCManager(session).getUserSessionWithClient(realm,
124
+ token.getSessionState(), true, clientModel.getId());
125
+ if (AuthenticationManager.isSessionValid(realm, offlineUserSession)) {
126
+ if (!checkTokenIssuedAt(token, offlineUserSession, clientModel)) {
127
+ return null;
128
+ }
129
+ return offlineUserSession;
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+
135
+ private UserSessionModel createTransientSessionForClient(AccessToken token, ClientModel client,
136
+ ClientConnection clientConnection) {
137
+ RealmModel realm = session.getContext().getRealm();
138
+ UserModel user = TokenManager.lookupUserFromStatelessToken(session, realm, token);
139
+ if (user == null) {
140
+ return null;
141
+ }
142
+ UserSessionModel userSession = session.sessions().createUserSession(KeycloakModelUtils.generateId(), realm, user,
143
+ user.getUsername(), clientConnection.getRemoteAddr(),
144
+ ServiceAccountConstants.CLIENT_AUTH, false, null, null, UserSessionModel.SessionPersistenceState.TRANSIENT);
145
+ RootAuthenticationSessionModel rootAuthSession = session.authenticationSessions()
146
+ .createRootAuthenticationSession(realm);
147
+ AuthenticationSessionModel authSession = rootAuthSession.createAuthenticationSession(client);
148
+ authSession.setAuthenticatedUser(userSession.getUser());
149
+ authSession.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
150
+ authSession.setClientNote(OIDCLoginProtocol.ISSUER,
151
+ Urls.realmIssuer(session.getContext().getUri().getBaseUri(), realm.getName()));
152
+ AuthenticationManager.setClientScopesInSession(session, authSession);
153
+ TokenManager.attachAuthenticationSession(session, userSession, authSession);
154
+ return userSession;
155
+ }
156
+
157
+ private boolean checkTokenIssuedAt(AccessToken token, UserSessionModel userSession, ClientModel client) {
158
+ if (token.isIssuedBeforeSessionStart(userSession.getStarted())) {
159
+ return false;
160
+ }
161
+ AuthenticatedClientSessionModel clientSession = userSession.getAuthenticatedClientSessionByClient(client.getId());
162
+ if (token.isIssuedBeforeSessionStart(clientSession.getStarted())) {
163
+ return false;
164
+ }
165
+ return true;
166
+ }
167
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * File: /src/main/java/com/bitspur/keycloak/siwe/SiweCredentials.java
3
+ * Project: authenticators
4
+ * File Created: 27-03-2022 13:41:10
5
+ * Author: Clay Risser
6
+ * -----
7
+ * Last Modified: 09-01-2025 22:52:35
8
+ * Modified By: Clay Risser
9
+ * -----
10
+ * BitSpur (c) Copyright 2022
11
+ */
12
+
13
+ package com.bitspur.keycloak.siwe;
14
+
15
+ import com.bitspur.keycloak.siwe.Errors.SiweKeycloakException;
16
+ import com.moonstoneid.siwe.SiweMessage.Parser;
17
+ import com.moonstoneid.siwe.SiweMessage;
18
+ import com.moonstoneid.siwe.error.SiweException;
19
+ import java.util.Base64;
20
+
21
+ public class SiweCredentials {
22
+ private static final Base64.Decoder decoder = Base64.getDecoder();
23
+
24
+ public SiweMessage message;
25
+
26
+ public String signature;
27
+
28
+ public SiweCredentials(String username, String password) throws SiweKeycloakException {
29
+ this.signature = username;
30
+ try {
31
+ this.message = new Parser().parse(new String(decoder.decode(password)));
32
+ } catch (SiweException e) {
33
+ throw new SiweKeycloakException(e.getMessage());
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * File: /src/main/java/com/bitspur/keycloak/siwe/SiweSession.java
3
+ * Project: siwe-keycloak
4
+ * File Created: 10-04-2023 23:23:57
5
+ * Author: Clay Risser
6
+ * -----
7
+ * Last Modified: 10-08-2023 16:34:52
8
+ * Modified By: Clay Risser
9
+ * -----
10
+ * BitSpur (c) Copyright 2022 - 2023
11
+ */
12
+
13
+ package com.bitspur.keycloak.siwe;
14
+
15
+ public class SiweSession {
16
+ private String key;
17
+
18
+ private String nonce;
19
+
20
+ public SiweSession(String key, String nonce) {
21
+ this.key = key;
22
+ this.nonce = nonce;
23
+ }
24
+
25
+ public String getSessionKey() {
26
+ return this.key;
27
+ }
28
+
29
+ public String getKey() {
30
+ return this.key;
31
+ }
32
+
33
+ public String getNonce() {
34
+ return this.nonce;
35
+ }
36
+ }