@asgardeo/nextjs 0.0.3 → 0.1.0
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 +68 -8
- package/dist/AsgardeoNextClient.d.ts +37 -8
- package/dist/AsgardeoNextClient.js +153 -138
- package/dist/AsgardeoNextClient.js.map +1 -1
- package/dist/cjs/index.js +25 -2
- package/dist/cjs/index.js.map +2 -2
- package/dist/client/components/actions/SignInButton/SignInButton.d.ts +2 -2
- package/dist/client/components/actions/SignInButton/SignInButton.js +34 -7
- package/dist/client/components/actions/SignInButton/SignInButton.js.map +1 -1
- package/dist/client/components/actions/SignOutButton/SignOutButton.d.ts +1 -2
- package/dist/client/components/actions/SignOutButton/SignOutButton.js +25 -4
- package/dist/client/components/actions/SignOutButton/SignOutButton.js.map +1 -1
- package/dist/client/components/actions/SignUpButton/SignUpButton.d.ts +38 -14
- package/dist/client/components/actions/SignUpButton/SignUpButton.js +69 -15
- package/dist/client/components/actions/SignUpButton/SignUpButton.js.map +1 -1
- package/dist/client/components/control/SignedIn/SignedIn.js +3 -17
- package/dist/client/components/control/SignedIn/SignedIn.js.map +1 -1
- package/dist/client/components/control/SignedOut/SignedOut.js +3 -17
- package/dist/client/components/control/SignedOut/SignedOut.js.map +1 -1
- package/dist/client/components/presentation/SignIn/SignIn.d.ts +1 -1
- package/dist/client/components/presentation/SignIn/SignIn.js +9 -6
- package/dist/client/components/presentation/SignIn/SignIn.js.map +1 -1
- package/dist/client/components/presentation/SignUp/SignUp.d.ts +55 -0
- package/dist/client/components/presentation/SignUp/SignUp.js +70 -0
- package/dist/client/components/presentation/SignUp/SignUp.js.map +1 -0
- package/dist/client/components/presentation/UserDropdown/UserDropdown.d.ts +105 -0
- package/dist/client/components/presentation/UserDropdown/UserDropdown.js +106 -0
- package/dist/client/components/presentation/UserDropdown/UserDropdown.js.map +1 -0
- package/dist/client/components/presentation/UserProfile/UserProfile.d.ts +49 -0
- package/dist/client/components/presentation/UserProfile/UserProfile.js +57 -0
- package/dist/client/components/presentation/UserProfile/UserProfile.js.map +1 -0
- package/dist/client/contexts/Asgardeo/AsgardeoContext.d.ts +1 -8
- package/dist/client/contexts/Asgardeo/AsgardeoContext.js +13 -1
- package/dist/client/contexts/Asgardeo/AsgardeoContext.js.map +1 -1
- package/dist/client/contexts/Asgardeo/AsgardeoProvider.d.ts +15 -5
- package/dist/client/contexts/Asgardeo/AsgardeoProvider.js +115 -49
- package/dist/client/contexts/Asgardeo/AsgardeoProvider.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware/asgardeoMiddleware.d.ts +63 -0
- package/dist/middleware/asgardeoMiddleware.js +115 -0
- package/dist/middleware/asgardeoMiddleware.js.map +1 -0
- package/dist/server/AsgardeoProvider.d.ts +6 -3
- package/dist/server/AsgardeoProvider.js +42 -3
- package/dist/server/AsgardeoProvider.js.map +1 -1
- package/dist/server/actions/getClientOrigin.d.ts +2 -0
- package/dist/server/actions/getClientOrigin.js +10 -0
- package/dist/server/actions/getClientOrigin.js.map +1 -0
- package/dist/server/actions/getUserAction.d.ts +35 -0
- package/dist/server/actions/getUserAction.js +35 -0
- package/dist/server/actions/getUserAction.js.map +1 -0
- package/dist/server/actions/getUserProfileAction.d.ts +40 -0
- package/dist/server/actions/getUserProfileAction.js +45 -0
- package/dist/server/actions/getUserProfileAction.js.map +1 -0
- package/dist/server/actions/handleOAuthCallbackAction.d.ts +33 -0
- package/dist/server/actions/handleOAuthCallbackAction.js +80 -0
- package/dist/server/actions/handleOAuthCallbackAction.js.map +1 -0
- package/dist/server/actions/isSignedIn.d.ts +1 -1
- package/dist/server/actions/isSignedIn.js +5 -5
- package/dist/server/actions/isSignedIn.js.map +1 -1
- package/dist/server/actions/signInAction.d.ts +35 -0
- package/dist/server/actions/signInAction.js +71 -0
- package/dist/server/actions/signInAction.js.map +1 -0
- package/dist/server/actions/signOutAction.d.ts +25 -0
- package/dist/server/actions/signOutAction.js +33 -0
- package/dist/server/actions/signOutAction.js.map +1 -0
- package/dist/server/actions/signUpAction.d.ts +35 -0
- package/dist/server/actions/signUpAction.js +52 -0
- package/dist/server/actions/signUpAction.js.map +1 -0
- package/dist/server/actions/updateUserProfileAction.d.ts +36 -0
- package/dist/server/actions/updateUserProfileAction.js +41 -0
- package/dist/server/actions/updateUserProfileAction.js.map +1 -0
- package/dist/utils/decorateConfigWithNextEnv.js +5 -1
- package/dist/utils/decorateConfigWithNextEnv.js.map +1 -1
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -23,6 +23,8 @@ yarn add @asgardeo/nextjs
|
|
|
23
23
|
|
|
24
24
|
## Quick Start
|
|
25
25
|
|
|
26
|
+
### Option 1: Provider-based Configuration (Recommended)
|
|
27
|
+
|
|
26
28
|
1. Create a `.env.local` file with your Asgardeo configuration:
|
|
27
29
|
|
|
28
30
|
```bash
|
|
@@ -31,24 +33,64 @@ NEXT_PUBLIC_ASGARDEO_CLIENT_ID=<your-client-id>
|
|
|
31
33
|
NEXT_PUBLIC_ASGARDEO_CLIENT_SECRET=<your-client-secret>
|
|
32
34
|
```
|
|
33
35
|
|
|
34
|
-
2.
|
|
36
|
+
2. Add the `AsgardeoProvider` to your root layout with configuration:
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
// app/layout.tsx
|
|
40
|
+
import { AsgardeoProvider } from '@asgardeo/nextjs';
|
|
41
|
+
|
|
42
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
43
|
+
const asgardeoConfig = {
|
|
44
|
+
baseUrl: process.env.NEXT_PUBLIC_ASGARDEO_BASE_URL,
|
|
45
|
+
clientId: process.env.NEXT_PUBLIC_ASGARDEO_CLIENT_ID,
|
|
46
|
+
clientSecret: process.env.NEXT_PUBLIC_ASGARDEO_CLIENT_SECRET,
|
|
47
|
+
afterSignInUrl: process.env.NEXT_PUBLIC_ASGARDEO_AFTER_SIGN_IN_URL || 'http://localhost:3000',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<html lang="en">
|
|
52
|
+
<body>
|
|
53
|
+
<AsgardeoProvider config={asgardeoConfig}>
|
|
54
|
+
{children}
|
|
55
|
+
</AsgardeoProvider>
|
|
56
|
+
</body>
|
|
57
|
+
</html>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
3. Create a simple `middleware.ts` file in your project root:
|
|
35
63
|
|
|
36
64
|
```typescript
|
|
37
|
-
import {
|
|
38
|
-
|
|
65
|
+
import { asgardeoMiddleware } from '@asgardeo/nextjs/middleware';
|
|
66
|
+
|
|
67
|
+
export default asgardeoMiddleware;
|
|
68
|
+
|
|
69
|
+
export const config = {
|
|
70
|
+
matcher: [
|
|
71
|
+
// Skip Next.js internals and all static files, unless found in search params
|
|
72
|
+
'/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
|
|
73
|
+
// Always run for API routes
|
|
74
|
+
'/(api|trpc)(.*)',
|
|
75
|
+
],
|
|
76
|
+
};
|
|
77
|
+
```
|
|
39
78
|
|
|
40
|
-
|
|
79
|
+
### Option 2: Middleware-based Configuration
|
|
80
|
+
|
|
81
|
+
2. Then create a `middleware.ts` file in your project root to handle authentication:
|
|
41
82
|
|
|
42
|
-
|
|
83
|
+
```typescript
|
|
84
|
+
import { createAsgardeoMiddleware } from '@asgardeo/nextjs/middleware';
|
|
85
|
+
|
|
86
|
+
const middleware = createAsgardeoMiddleware({
|
|
43
87
|
baseUrl: process.env.NEXT_PUBLIC_ASGARDEO_BASE_URL,
|
|
44
88
|
clientId: process.env.NEXT_PUBLIC_ASGARDEO_CLIENT_ID,
|
|
45
89
|
clientSecret: process.env.NEXT_PUBLIC_ASGARDEO_CLIENT_SECRET,
|
|
46
90
|
afterSignInUrl: 'http://localhost:3000',
|
|
47
91
|
});
|
|
48
92
|
|
|
49
|
-
export
|
|
50
|
-
return await asgardeo.middleware(request);
|
|
51
|
-
}
|
|
93
|
+
export { middleware };
|
|
52
94
|
|
|
53
95
|
export const config = {
|
|
54
96
|
matcher: [
|
|
@@ -82,6 +124,24 @@ export default function Home() {
|
|
|
82
124
|
}
|
|
83
125
|
```
|
|
84
126
|
|
|
127
|
+
## Server-side Usage
|
|
128
|
+
|
|
129
|
+
You can access the Asgardeo client instance in server actions and other server-side code:
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
import { getAsgardeoClient } from '@asgardeo/nextjs/server';
|
|
133
|
+
|
|
134
|
+
export async function getUserProfile() {
|
|
135
|
+
const client = getAsgardeoClient();
|
|
136
|
+
const user = await client.getUser();
|
|
137
|
+
return user;
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Architecture
|
|
142
|
+
|
|
143
|
+
The SDK uses a singleton pattern for the `AsgardeoNextClient` to ensure consistent authentication state across your application. The client is automatically initialized when you provide configuration through the `AsgardeoProvider` or through the middleware configuration.
|
|
144
|
+
|
|
85
145
|
## License
|
|
86
146
|
|
|
87
147
|
Apache-2.0
|
|
@@ -15,33 +15,62 @@
|
|
|
15
15
|
* specific language governing permissions and limitations
|
|
16
16
|
* under the License.
|
|
17
17
|
*/
|
|
18
|
-
import { AsgardeoNodeClient, EmbeddedFlowExecuteRequestPayload, EmbeddedFlowExecuteResponse, SignInOptions, SignOutOptions, SignUpOptions, User, UserProfile, Organization, EmbeddedSignInFlowHandleRequestPayload, EmbeddedFlowExecuteRequestConfig } from '@asgardeo/node';
|
|
19
|
-
import { NextRequest, NextResponse } from 'next/server';
|
|
18
|
+
import { AsgardeoNodeClient, EmbeddedFlowExecuteRequestPayload, EmbeddedFlowExecuteResponse, SignInOptions, SignOutOptions, SignUpOptions, User, UserProfile, Organization, EmbeddedSignInFlowHandleRequestPayload, EmbeddedFlowExecuteRequestConfig, ExtendedAuthorizeRequestUrlParams } from '@asgardeo/node';
|
|
20
19
|
import { AsgardeoNextConfig } from './models/config';
|
|
21
20
|
/**
|
|
22
21
|
* Client for mplementing Asgardeo in Next.js applications.
|
|
23
22
|
* This class provides the core functionality for managing user authentication and sessions.
|
|
24
23
|
*
|
|
24
|
+
* This class is implemented as a singleton to ensure a single instance across the application.
|
|
25
|
+
*
|
|
25
26
|
* @typeParam T - Configuration type that extends AsgardeoNextConfig.
|
|
26
27
|
*/
|
|
27
28
|
declare class AsgardeoNextClient<T extends AsgardeoNextConfig = AsgardeoNextConfig> extends AsgardeoNodeClient<T> {
|
|
29
|
+
private static instance;
|
|
28
30
|
private asgardeo;
|
|
29
|
-
|
|
31
|
+
isInitialized: boolean;
|
|
32
|
+
private constructor();
|
|
33
|
+
/**
|
|
34
|
+
* Get the singleton instance of AsgardeoNextClient
|
|
35
|
+
*/
|
|
36
|
+
static getInstance<T extends AsgardeoNextConfig = AsgardeoNextConfig>(): AsgardeoNextClient<T>;
|
|
37
|
+
/**
|
|
38
|
+
* Ensures the client is initialized before using it.
|
|
39
|
+
* Throws an error if the client is not initialized.
|
|
40
|
+
*/
|
|
41
|
+
private ensureInitialized;
|
|
30
42
|
initialize(config: T): Promise<boolean>;
|
|
31
43
|
getUser(userId?: string): Promise<User>;
|
|
44
|
+
getUserProfile(userId?: string): Promise<UserProfile>;
|
|
45
|
+
updateUserProfile(payload: any, userId?: string): Promise<User>;
|
|
32
46
|
getOrganizations(): Promise<Organization[]>;
|
|
33
|
-
getUserProfile(): Promise<UserProfile>;
|
|
34
47
|
switchOrganization(organization: Organization): Promise<void>;
|
|
35
48
|
getCurrentOrganization(): Promise<Organization | null>;
|
|
36
49
|
isLoading(): boolean;
|
|
37
50
|
isSignedIn(sessionId?: string): Promise<boolean>;
|
|
51
|
+
getAccessToken(sessionId?: string): Promise<string>;
|
|
52
|
+
getConfiguration(): T;
|
|
38
53
|
signIn(options?: SignInOptions, sessionId?: string, onSignInSuccess?: (afterSignInUrl: string) => void): Promise<User>;
|
|
39
54
|
signIn(payload: EmbeddedSignInFlowHandleRequestPayload, request: EmbeddedFlowExecuteRequestConfig, sessionId?: string, onSignInSuccess?: (afterSignInUrl: string) => void): Promise<User>;
|
|
40
|
-
signOut(options?: SignOutOptions, afterSignOut?: (
|
|
41
|
-
signOut(options?: SignOutOptions, sessionId?: string, afterSignOut?: (
|
|
55
|
+
signOut(options?: SignOutOptions, afterSignOut?: (afterSignOutUrl: string) => void): Promise<string>;
|
|
56
|
+
signOut(options?: SignOutOptions, sessionId?: string, afterSignOut?: (afterSignOutUrl: string) => void): Promise<string>;
|
|
42
57
|
signUp(options?: SignUpOptions): Promise<void>;
|
|
43
58
|
signUp(payload: EmbeddedFlowExecuteRequestPayload): Promise<EmbeddedFlowExecuteResponse>;
|
|
44
|
-
|
|
45
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Gets the sign-in URL for authentication.
|
|
61
|
+
* Ensures the client is initialized before making the call.
|
|
62
|
+
*
|
|
63
|
+
* @param customParams - Custom parameters to include in the sign-in URL.
|
|
64
|
+
* @param userId - The user ID
|
|
65
|
+
* @returns Promise that resolves to the sign-in URL
|
|
66
|
+
*/
|
|
67
|
+
getAuthorizeRequestUrl(customParams: ExtendedAuthorizeRequestUrlParams, userId?: string): Promise<string>;
|
|
68
|
+
/**
|
|
69
|
+
* Gets the storage manager from the underlying Asgardeo client.
|
|
70
|
+
* Ensures the client is initialized before making the call.
|
|
71
|
+
*
|
|
72
|
+
* @returns Promise that resolves to the storage manager
|
|
73
|
+
*/
|
|
74
|
+
getStorageManager(): Promise<any>;
|
|
46
75
|
}
|
|
47
76
|
export default AsgardeoNextClient;
|
|
@@ -15,45 +15,140 @@
|
|
|
15
15
|
* specific language governing permissions and limitations
|
|
16
16
|
* under the License.
|
|
17
17
|
*/
|
|
18
|
-
import { AsgardeoNodeClient, AsgardeoRuntimeError, LegacyAsgardeoNodeClient, initializeEmbeddedSignInFlow, executeEmbeddedSignInFlow,
|
|
19
|
-
import { NextResponse } from 'next/server';
|
|
20
|
-
import InternalAuthAPIRoutesConfig from './configs/InternalAuthAPIRoutesConfig';
|
|
21
|
-
import deleteSessionId from './server/actions/deleteSessionId';
|
|
18
|
+
import { AsgardeoNodeClient, AsgardeoRuntimeError, LegacyAsgardeoNodeClient, initializeEmbeddedSignInFlow, executeEmbeddedSignInFlow, generateUserProfile, flattenUserSchema, getScim2Me, getSchemas, generateFlattenedUserProfile, updateMeProfile, executeEmbeddedSignUpFlow, } from '@asgardeo/node';
|
|
22
19
|
import getSessionId from './server/actions/getSessionId';
|
|
23
|
-
import getIsSignedIn from './server/actions/isSignedIn';
|
|
24
20
|
import decorateConfigWithNextEnv from './utils/decorateConfigWithNextEnv';
|
|
21
|
+
import getClientOrigin from './server/actions/getClientOrigin';
|
|
25
22
|
const removeTrailingSlash = (path) => (path.endsWith('/') ? path.slice(0, -1) : path);
|
|
26
23
|
/**
|
|
27
24
|
* Client for mplementing Asgardeo in Next.js applications.
|
|
28
25
|
* This class provides the core functionality for managing user authentication and sessions.
|
|
29
26
|
*
|
|
27
|
+
* This class is implemented as a singleton to ensure a single instance across the application.
|
|
28
|
+
*
|
|
30
29
|
* @typeParam T - Configuration type that extends AsgardeoNextConfig.
|
|
31
30
|
*/
|
|
32
31
|
class AsgardeoNextClient extends AsgardeoNodeClient {
|
|
32
|
+
static instance;
|
|
33
33
|
asgardeo;
|
|
34
|
+
isInitialized = false;
|
|
34
35
|
constructor() {
|
|
35
36
|
super();
|
|
36
37
|
this.asgardeo = new LegacyAsgardeoNodeClient();
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Get the singleton instance of AsgardeoNextClient
|
|
41
|
+
*/
|
|
42
|
+
static getInstance() {
|
|
43
|
+
if (!AsgardeoNextClient.instance) {
|
|
44
|
+
AsgardeoNextClient.instance = new AsgardeoNextClient();
|
|
45
|
+
}
|
|
46
|
+
return AsgardeoNextClient.instance;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Ensures the client is initialized before using it.
|
|
50
|
+
* Throws an error if the client is not initialized.
|
|
51
|
+
*/
|
|
52
|
+
async ensureInitialized() {
|
|
53
|
+
if (!this.isInitialized) {
|
|
54
|
+
throw new Error('[AsgardeoNextClient] Client is not initialized. Make sure you have wrapped your app with AsgardeoProvider and provided the required configuration (baseUrl, clientId, etc.).');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async initialize(config) {
|
|
58
|
+
if (this.isInitialized) {
|
|
59
|
+
console.warn('[AsgardeoNextClient] Client is already initialized');
|
|
60
|
+
return Promise.resolve(true);
|
|
61
|
+
}
|
|
62
|
+
const { baseUrl, clientId, clientSecret, signInUrl, afterSignInUrl, afterSignOutUrl, signUpUrl, ...rest } = decorateConfigWithNextEnv(config);
|
|
63
|
+
this.isInitialized = true;
|
|
64
|
+
const origin = await getClientOrigin();
|
|
40
65
|
return this.asgardeo.initialize({
|
|
41
66
|
baseUrl,
|
|
42
67
|
clientId,
|
|
43
68
|
clientSecret,
|
|
44
|
-
|
|
69
|
+
signInUrl,
|
|
70
|
+
signUpUrl,
|
|
71
|
+
afterSignInUrl: afterSignInUrl ?? origin,
|
|
72
|
+
afterSignOutUrl: afterSignOutUrl ?? origin,
|
|
45
73
|
enablePKCE: false,
|
|
46
74
|
...rest,
|
|
47
75
|
});
|
|
48
76
|
}
|
|
49
77
|
async getUser(userId) {
|
|
78
|
+
await this.ensureInitialized();
|
|
50
79
|
const resolvedSessionId = userId || (await getSessionId());
|
|
51
|
-
|
|
80
|
+
try {
|
|
81
|
+
const configData = await this.asgardeo.getConfigData();
|
|
82
|
+
const baseUrl = configData?.baseUrl;
|
|
83
|
+
const profile = await getScim2Me({
|
|
84
|
+
baseUrl,
|
|
85
|
+
headers: {
|
|
86
|
+
Authorization: `Bearer ${await this.getAccessToken(userId)}`,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
const schemas = await getSchemas({
|
|
90
|
+
baseUrl,
|
|
91
|
+
headers: {
|
|
92
|
+
Authorization: `Bearer ${await this.getAccessToken(userId)}`,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
return generateUserProfile(profile, flattenUserSchema(schemas));
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return this.asgardeo.getUser(resolvedSessionId);
|
|
99
|
+
}
|
|
52
100
|
}
|
|
53
|
-
async
|
|
54
|
-
|
|
101
|
+
async getUserProfile(userId) {
|
|
102
|
+
await this.ensureInitialized();
|
|
103
|
+
try {
|
|
104
|
+
const configData = await this.asgardeo.getConfigData();
|
|
105
|
+
const baseUrl = configData?.baseUrl;
|
|
106
|
+
const profile = await getScim2Me({
|
|
107
|
+
baseUrl,
|
|
108
|
+
headers: {
|
|
109
|
+
Authorization: `Bearer ${await this.getAccessToken(userId)}`,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
const schemas = await getSchemas({
|
|
113
|
+
baseUrl,
|
|
114
|
+
headers: {
|
|
115
|
+
Authorization: `Bearer ${await this.getAccessToken(userId)}`,
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
const processedSchemas = flattenUserSchema(schemas);
|
|
119
|
+
const output = {
|
|
120
|
+
schemas: processedSchemas,
|
|
121
|
+
flattenedProfile: generateFlattenedUserProfile(profile, processedSchemas),
|
|
122
|
+
profile,
|
|
123
|
+
};
|
|
124
|
+
return output;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return {
|
|
128
|
+
schemas: [],
|
|
129
|
+
flattenedProfile: await this.asgardeo.getDecodedIdToken(),
|
|
130
|
+
profile: await this.asgardeo.getDecodedIdToken(),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async updateUserProfile(payload, userId) {
|
|
135
|
+
await this.ensureInitialized();
|
|
136
|
+
try {
|
|
137
|
+
const configData = await this.asgardeo.getConfigData();
|
|
138
|
+
const baseUrl = configData?.baseUrl;
|
|
139
|
+
return await updateMeProfile({
|
|
140
|
+
baseUrl,
|
|
141
|
+
payload,
|
|
142
|
+
headers: {
|
|
143
|
+
Authorization: `Bearer ${await this.getAccessToken(userId)}`,
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
throw new AsgardeoRuntimeError(`Failed to update user profile: ${error instanceof Error ? error.message : 'Unknown error'}`, 'AsgardeoNextClient-UpdateProfileError-001', 'react', 'An error occurred while updating the user profile. Please check your configuration and network connection.');
|
|
149
|
+
}
|
|
55
150
|
}
|
|
56
|
-
|
|
151
|
+
async getOrganizations() {
|
|
57
152
|
throw new Error('Method not implemented.');
|
|
58
153
|
}
|
|
59
154
|
switchOrganization(organization) {
|
|
@@ -68,16 +163,26 @@ class AsgardeoNextClient extends AsgardeoNodeClient {
|
|
|
68
163
|
isSignedIn(sessionId) {
|
|
69
164
|
return this.asgardeo.isSignedIn(sessionId);
|
|
70
165
|
}
|
|
166
|
+
getAccessToken(sessionId) {
|
|
167
|
+
return this.asgardeo.getAccessToken(sessionId);
|
|
168
|
+
}
|
|
169
|
+
getConfiguration() {
|
|
170
|
+
return this.asgardeo.getConfigData();
|
|
171
|
+
}
|
|
71
172
|
async signIn(...args) {
|
|
72
173
|
const arg1 = args[0];
|
|
73
174
|
const arg2 = args[1];
|
|
74
175
|
const arg3 = args[2];
|
|
75
176
|
const arg4 = args[3];
|
|
76
|
-
if (typeof arg1 === 'object' && 'flowId' in arg1
|
|
177
|
+
if (typeof arg1 === 'object' && 'flowId' in arg1) {
|
|
77
178
|
if (arg1.flowId === '') {
|
|
179
|
+
const defaultSignInUrl = new URL(await this.getAuthorizeRequestUrl({
|
|
180
|
+
response_mode: 'direct',
|
|
181
|
+
client_secret: '{{clientSecret}}',
|
|
182
|
+
}));
|
|
78
183
|
return initializeEmbeddedSignInFlow({
|
|
79
|
-
|
|
80
|
-
|
|
184
|
+
url: `${defaultSignInUrl.origin}${defaultSignInUrl.pathname}`,
|
|
185
|
+
payload: Object.fromEntries(defaultSignInUrl.searchParams.entries()),
|
|
81
186
|
});
|
|
82
187
|
}
|
|
83
188
|
return executeEmbeddedSignInFlow({
|
|
@@ -95,131 +200,41 @@ class AsgardeoNextClient extends AsgardeoNodeClient {
|
|
|
95
200
|
return Promise.resolve(await this.asgardeo.signOut(resolvedSessionId));
|
|
96
201
|
}
|
|
97
202
|
async signUp(...args) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
async handler(req) {
|
|
101
|
-
const { pathname, searchParams } = req.nextUrl;
|
|
102
|
-
const sanitizedPathname = removeTrailingSlash(pathname);
|
|
103
|
-
const { method } = req;
|
|
104
|
-
// Handle POST sign-in request
|
|
105
|
-
if (method === 'POST' && sanitizedPathname === InternalAuthAPIRoutesConfig.signIn) {
|
|
106
|
-
try {
|
|
107
|
-
// Get session ID from cookies directly since we're in middleware context
|
|
108
|
-
let userId = req.cookies.get(CookieConfig.SESSION_COOKIE_NAME)?.value;
|
|
109
|
-
// Generate session ID if not present
|
|
110
|
-
if (!userId) {
|
|
111
|
-
userId = generateSessionId();
|
|
112
|
-
}
|
|
113
|
-
const signInUrl = new URL(await this.asgardeo.getSignInUrl({ response_mode: 'direct' }, userId));
|
|
114
|
-
const { pathname: urlPathname, origin, searchParams: urlSearchParams } = signInUrl;
|
|
115
|
-
console.log('[AsgardeoNextClient] Sign-in URL:', signInUrl.toString());
|
|
116
|
-
console.log('[AsgardeoNextClient] Search Params:', Object.fromEntries(urlSearchParams.entries()));
|
|
117
|
-
const body = await req.json();
|
|
118
|
-
console.log('[AsgardeoNextClient] Sign-in request:', body);
|
|
119
|
-
const { payload, request } = body;
|
|
120
|
-
const response = await this.signIn(payload, {
|
|
121
|
-
url: request?.url ?? `${origin}${urlPathname}`,
|
|
122
|
-
payload: request?.payload ?? Object.fromEntries(urlSearchParams.entries()),
|
|
123
|
-
}, userId);
|
|
124
|
-
// Clean the response to remove any non-serializable properties
|
|
125
|
-
const cleanResponse = response ? JSON.parse(JSON.stringify(response)) : { success: true };
|
|
126
|
-
// Create response with session cookie
|
|
127
|
-
const nextResponse = NextResponse.json(cleanResponse);
|
|
128
|
-
// Set session cookie if it was generated
|
|
129
|
-
if (!req.cookies.get(CookieConfig.SESSION_COOKIE_NAME)) {
|
|
130
|
-
nextResponse.cookies.set(CookieConfig.SESSION_COOKIE_NAME, userId, {
|
|
131
|
-
httpOnly: CookieConfig.DEFAULT_HTTP_ONLY,
|
|
132
|
-
maxAge: CookieConfig.DEFAULT_MAX_AGE,
|
|
133
|
-
sameSite: CookieConfig.DEFAULT_SAME_SITE,
|
|
134
|
-
secure: CookieConfig.DEFAULT_SECURE,
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
if (response.flowStatus === EmbeddedSignInFlowStatus.SuccessCompleted) {
|
|
138
|
-
const res = await this.signIn({
|
|
139
|
-
code: response?.authData?.code,
|
|
140
|
-
session_state: response?.authData?.session_state,
|
|
141
|
-
state: response?.authData?.state,
|
|
142
|
-
}, {}, userId, (afterSignInUrl) => null);
|
|
143
|
-
const afterSignInUrl = await (await this.asgardeo.getStorageManager()).getConfigDataParameter('afterSignInUrl');
|
|
144
|
-
const redirectUrl = String(afterSignInUrl);
|
|
145
|
-
console.log('[AsgardeoNextClient] Sign-in successful, redirecting to:', redirectUrl);
|
|
146
|
-
return NextResponse.redirect(redirectUrl, 303);
|
|
147
|
-
}
|
|
148
|
-
return nextResponse;
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
console.error('[AsgardeoNextClient] Failed to initialize embedded sign-in flow:', error);
|
|
152
|
-
return NextResponse.json({ error: 'Failed to initialize sign-in flow' }, { status: 500 });
|
|
153
|
-
}
|
|
203
|
+
if (args.length === 0) {
|
|
204
|
+
throw new AsgardeoRuntimeError('No arguments provided for signUp method.', 'AsgardeoNextClient-ValidationError-001', 'nextjs', 'The signUp method requires at least one argument, either a SignUpOptions object or an EmbeddedFlowExecuteRequestPayload.');
|
|
154
205
|
}
|
|
155
|
-
|
|
156
|
-
if (
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
cleanUrl.searchParams.delete('state');
|
|
164
|
-
cleanUrl.searchParams.delete('session_state');
|
|
165
|
-
return NextResponse.redirect(cleanUrl.toString());
|
|
166
|
-
}
|
|
167
|
-
// Regular GET sign-in request
|
|
168
|
-
await this.signIn();
|
|
169
|
-
return NextResponse.next();
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
console.error('[AsgardeoNextClient] Sign-in failed:', error);
|
|
173
|
-
return NextResponse.json({ error: 'Sign-in failed' }, { status: 500 });
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
if (method === 'GET' && sanitizedPathname === InternalAuthAPIRoutesConfig.session) {
|
|
177
|
-
try {
|
|
178
|
-
const isSignedIn = await getIsSignedIn();
|
|
179
|
-
return NextResponse.json({ isSignedIn });
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
return NextResponse.json({ error: 'Failed to check session' }, { status: 500 });
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
if (method === 'GET' && sanitizedPathname === InternalAuthAPIRoutesConfig.user) {
|
|
186
|
-
try {
|
|
187
|
-
const user = await this.getUser();
|
|
188
|
-
console.log('[AsgardeoNextClient] User fetched successfully:', user);
|
|
189
|
-
return NextResponse.json({ user });
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
192
|
-
console.error('[AsgardeoNextClient] Failed to get user:', error);
|
|
193
|
-
return NextResponse.json({ error: 'Failed to get user' }, { status: 500 });
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
if (method === 'GET' && sanitizedPathname === InternalAuthAPIRoutesConfig.signOut) {
|
|
197
|
-
try {
|
|
198
|
-
const afterSignOutUrl = await this.signOut();
|
|
199
|
-
await deleteSessionId();
|
|
200
|
-
return NextResponse.redirect(afterSignOutUrl, 302);
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
console.error('[AsgardeoNextClient] Sign-out failed:', error);
|
|
204
|
-
return NextResponse.json({ error: 'Failed to sign out' }, { status: 500 });
|
|
205
|
-
}
|
|
206
|
+
const firstArg = args[0];
|
|
207
|
+
if (typeof firstArg === 'object' && 'flowType' in firstArg) {
|
|
208
|
+
const configData = await this.asgardeo.getConfigData();
|
|
209
|
+
const baseUrl = configData?.baseUrl;
|
|
210
|
+
return executeEmbeddedSignUpFlow({
|
|
211
|
+
baseUrl,
|
|
212
|
+
payload: firstArg,
|
|
213
|
+
});
|
|
206
214
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
return
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
215
|
+
throw new AsgardeoRuntimeError('Not implemented', 'AsgardeoNextClient-ValidationError-002', 'nextjs', 'The signUp method with SignUpOptions is not implemented in the Next.js client.');
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Gets the sign-in URL for authentication.
|
|
219
|
+
* Ensures the client is initialized before making the call.
|
|
220
|
+
*
|
|
221
|
+
* @param customParams - Custom parameters to include in the sign-in URL.
|
|
222
|
+
* @param userId - The user ID
|
|
223
|
+
* @returns Promise that resolves to the sign-in URL
|
|
224
|
+
*/
|
|
225
|
+
async getAuthorizeRequestUrl(customParams, userId) {
|
|
226
|
+
await this.ensureInitialized();
|
|
227
|
+
return this.asgardeo.getSignInUrl(customParams, userId);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Gets the storage manager from the underlying Asgardeo client.
|
|
231
|
+
* Ensures the client is initialized before making the call.
|
|
232
|
+
*
|
|
233
|
+
* @returns Promise that resolves to the storage manager
|
|
234
|
+
*/
|
|
235
|
+
async getStorageManager() {
|
|
236
|
+
await this.ensureInitialized();
|
|
237
|
+
return this.asgardeo.getStorageManager();
|
|
223
238
|
}
|
|
224
239
|
}
|
|
225
240
|
export default AsgardeoNextClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsgardeoNextClient.js","sourceRoot":"","sources":["../src/AsgardeoNextClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EAGpB,wBAAwB,EAMxB,4BAA4B,EAG5B,yBAAyB,
|
|
1
|
+
{"version":3,"file":"AsgardeoNextClient.js","sourceRoot":"","sources":["../src/AsgardeoNextClient.ts"],"names":[],"mappings":"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"}
|