Skip to content

Commit f698c2e

Browse files
authored
Extended onComplete (#540)
1 parent dc0f861 commit f698c2e

File tree

9 files changed

+198
-9
lines changed

9 files changed

+198
-9
lines changed

packages/connect-react/src/components/login/LoginErrorScreenHard.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ const LoginErrorScreenHard = ({ previousAssertionOptions }: Props) => {
6161
setLoading(false);
6262

6363
try {
64-
await config.onComplete(connectLoginFinishToComplete(resFinish.val), getConnectService().encodeClientState());
64+
await config.onComplete(
65+
connectLoginFinishToComplete(resFinish.val),
66+
getConnectService().encodeClientState(),
67+
resFinish.val.passkeyOperation.identifierValue,
68+
);
6569
} catch {
6670
return handleSituation(LoginSituationCode.CtApiNotAvailablePostAuthenticator);
6771
}

packages/connect-react/src/components/login/LoginErrorScreenSoft.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ const LoginErrorScreenSoft = ({ previousAssertionOptions }: Props) => {
5656
}
5757

5858
try {
59-
await config.onComplete(connectLoginFinishToComplete(resFinish.val), getConnectService().encodeClientState());
59+
await config.onComplete(
60+
connectLoginFinishToComplete(resFinish.val),
61+
getConnectService().encodeClientState(),
62+
resFinish.val.passkeyOperation.identifierValue,
63+
);
6064
setLoading(false);
6165
} catch {
6266
handleSituation(LoginSituationCode.CtApiNotAvailablePostAuthenticator);

packages/connect-react/src/components/login/LoginHybridScreen.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ const LoginHybridScreen = (resStart: ConnectLoginStartRsp) => {
3232
}
3333

3434
try {
35-
await config.onComplete(connectLoginFinishToComplete(res.val), getConnectService().encodeClientState());
35+
await config.onComplete(
36+
connectLoginFinishToComplete(res.val),
37+
getConnectService().encodeClientState(),
38+
res.val.passkeyOperation.identifierValue,
39+
);
3640
} catch {
3741
return handleSituation(LoginSituationCode.CtApiNotAvailablePostAuthenticator);
3842
}

packages/connect-react/src/components/login/LoginInitScreen.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,11 @@ const LoginInitScreen: FC<Props> = ({ showFallback = false }) => {
178178
}
179179

180180
try {
181-
await config.onComplete(connectLoginFinishToComplete(res.val), getConnectService().encodeClientState());
181+
await config.onComplete(
182+
connectLoginFinishToComplete(res.val),
183+
getConnectService().encodeClientState(),
184+
res.val.passkeyOperation.identifierValue,
185+
);
182186
} catch {
183187
return handleSituation(LoginSituationCode.CtApiNotAvailablePostAuthenticator);
184188
}
@@ -228,7 +232,11 @@ const LoginInitScreen: FC<Props> = ({ showFallback = false }) => {
228232
}
229233

230234
try {
231-
await config.onComplete(connectLoginFinishToComplete(res.val), getConnectService().encodeClientState());
235+
await config.onComplete(
236+
connectLoginFinishToComplete(res.val),
237+
getConnectService().encodeClientState(),
238+
res.val.passkeyOperation.identifierValue,
239+
);
232240
} catch {
233241
void getConnectService().recordEventLoginErrorUntyped();
234242
return handleSituation(LoginSituationCode.CtApiNotAvailablePostAuthenticator);

packages/connect-react/src/components/login/LoginPasskeyReLoginScreen.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ export const LoginPasskeyReLoginScreen = () => {
5353
}
5454

5555
try {
56-
await config.onComplete(connectLoginFinishToComplete(resFinish.val), getConnectService().encodeClientState());
56+
await config.onComplete(
57+
connectLoginFinishToComplete(resFinish.val),
58+
getConnectService().encodeClientState(),
59+
resFinish.val.passkeyOperation.identifierValue,
60+
);
5761
} catch {
5862
return handleSituation(LoginSituationCode.CtApiNotAvailablePostAuthenticator);
5963
}

packages/types/src/connect/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export type CorbadoConnectLoginConfig = {
44
onFallbackCustom?(identifier: string, code: string, payload: string): void;
55
onError?(error: string): void;
66
onLoaded?(message: string, isFallBackTriggered: boolean): void;
7-
onComplete(signedPasskeyData: string, clientState: string): Promise<void>;
7+
onComplete(signedPasskeyData: string, clientState: string, webauthnId: string): Promise<void>;
88
onConditionalLoginStart?(ac: AbortController): void;
99
onLoginStart?(): void;
1010
onHelpClick?(): void;

packages/web-core/openapi/spec_v2.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ tags:
3131
description: All API calls to manage users
3232
- name: CorbadoConnect
3333
description: All API calls that are related to a connect process
34+
- name: OIDC
35+
description: All API calls that are related to OpenID Connect
3436

3537
paths:
3638
/v2/process-config:
@@ -933,6 +935,24 @@ paths:
933935
"404":
934936
description: No process was found for the token
935937

938+
/v2/oidc/userInfo:
939+
get:
940+
summary: OIDC user info
941+
description: Retrieves user information in accordance with the OpenID Connect (OIDC) standard.
942+
operationId: OIDCUserInfoGet
943+
tags:
944+
- OIDC
945+
responses:
946+
"200":
947+
description: User information as per OIDC standard.
948+
content:
949+
application/json:
950+
schema:
951+
$ref: "#/components/schemas/oidcUserInfoRsp"
952+
"401":
953+
description: Unauthorized - Invalid or missing token
954+
955+
936956
components:
937957
###################################################################
938958
# Security schemes #
@@ -1392,6 +1412,7 @@ components:
13921412
required:
13931413
- session
13941414
- signedPasskeyData
1415+
- passkeyOperation
13951416
properties:
13961417
passkeyOperation:
13971418
$ref: "#/components/schemas/passkeyOperation"
@@ -1681,6 +1702,18 @@ components:
16811702
processId:
16821703
type: string
16831704

1705+
oidcUserInfoRsp:
1706+
type: object
1707+
required:
1708+
- sub
1709+
properties:
1710+
sub:
1711+
type: string
1712+
email:
1713+
type: string
1714+
email_verified:
1715+
type: boolean
1716+
16841717
aaguidDetails:
16851718
type: object
16861719
required:

packages/web-core/src/api/v2/api.ts

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ export interface ConnectLoginFinishRsp {
515515
* @type {PasskeyOperation}
516516
* @memberof ConnectLoginFinishRsp
517517
*/
518-
'passkeyOperation'?: PasskeyOperation;
518+
'passkeyOperation': PasskeyOperation;
519519
/**
520520
*
521521
* @type {string}
@@ -1902,6 +1902,31 @@ export const NativeMetaDeviceOwnerAuthEnum = {
19021902

19031903
export type NativeMetaDeviceOwnerAuthEnum = typeof NativeMetaDeviceOwnerAuthEnum[keyof typeof NativeMetaDeviceOwnerAuthEnum];
19041904

1905+
/**
1906+
*
1907+
* @export
1908+
* @interface OidcUserInfoRsp
1909+
*/
1910+
export interface OidcUserInfoRsp {
1911+
/**
1912+
*
1913+
* @type {string}
1914+
* @memberof OidcUserInfoRsp
1915+
*/
1916+
'sub': string;
1917+
/**
1918+
*
1919+
* @type {string}
1920+
* @memberof OidcUserInfoRsp
1921+
*/
1922+
'email'?: string;
1923+
/**
1924+
*
1925+
* @type {boolean}
1926+
* @memberof OidcUserInfoRsp
1927+
*/
1928+
'email_verified'?: boolean;
1929+
}
19051930
/**
19061931
*
19071932
* @export
@@ -5328,6 +5353,112 @@ export class CorbadoConnectApi extends BaseAPI {
53285353

53295354

53305355

5356+
/**
5357+
* OIDCApi - axios parameter creator
5358+
* @export
5359+
*/
5360+
export const OIDCApiAxiosParamCreator = function (configuration?: Configuration) {
5361+
return {
5362+
/**
5363+
* Retrieves user information in accordance with the OpenID Connect (OIDC) standard.
5364+
* @summary OIDC user info
5365+
* @param {*} [options] Override http request option.
5366+
* @throws {RequiredError}
5367+
*/
5368+
oIDCUserInfoGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
5369+
const localVarPath = `/v2/oidc/userInfo`;
5370+
// use dummy base URL string because the URL constructor only accepts absolute URLs.
5371+
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
5372+
let baseOptions;
5373+
if (configuration) {
5374+
baseOptions = configuration.baseOptions;
5375+
}
5376+
5377+
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
5378+
const localVarHeaderParameter = {} as any;
5379+
const localVarQueryParameter = {} as any;
5380+
5381+
// authentication bearerAuth required
5382+
// http bearer authentication required
5383+
await setBearerAuthToObject(localVarHeaderParameter, configuration)
5384+
5385+
// authentication projectID required
5386+
await setApiKeyToObject(localVarHeaderParameter, "X-Corbado-ProjectID", configuration)
5387+
5388+
5389+
5390+
setSearchParams(localVarUrlObj, localVarQueryParameter);
5391+
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
5392+
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
5393+
5394+
return {
5395+
url: toPathString(localVarUrlObj),
5396+
options: localVarRequestOptions,
5397+
};
5398+
},
5399+
}
5400+
};
5401+
5402+
/**
5403+
* OIDCApi - functional programming interface
5404+
* @export
5405+
*/
5406+
export const OIDCApiFp = function(configuration?: Configuration) {
5407+
const localVarAxiosParamCreator = OIDCApiAxiosParamCreator(configuration)
5408+
return {
5409+
/**
5410+
* Retrieves user information in accordance with the OpenID Connect (OIDC) standard.
5411+
* @summary OIDC user info
5412+
* @param {*} [options] Override http request option.
5413+
* @throws {RequiredError}
5414+
*/
5415+
async oIDCUserInfoGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<OidcUserInfoRsp>> {
5416+
const localVarAxiosArgs = await localVarAxiosParamCreator.oIDCUserInfoGet(options);
5417+
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
5418+
},
5419+
}
5420+
};
5421+
5422+
/**
5423+
* OIDCApi - factory interface
5424+
* @export
5425+
*/
5426+
export const OIDCApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
5427+
const localVarFp = OIDCApiFp(configuration)
5428+
return {
5429+
/**
5430+
* Retrieves user information in accordance with the OpenID Connect (OIDC) standard.
5431+
* @summary OIDC user info
5432+
* @param {*} [options] Override http request option.
5433+
* @throws {RequiredError}
5434+
*/
5435+
oIDCUserInfoGet(options?: any): AxiosPromise<OidcUserInfoRsp> {
5436+
return localVarFp.oIDCUserInfoGet(options).then((request) => request(axios, basePath));
5437+
},
5438+
};
5439+
};
5440+
5441+
/**
5442+
* OIDCApi - object-oriented interface
5443+
* @export
5444+
* @class OIDCApi
5445+
* @extends {BaseAPI}
5446+
*/
5447+
export class OIDCApi extends BaseAPI {
5448+
/**
5449+
* Retrieves user information in accordance with the OpenID Connect (OIDC) standard.
5450+
* @summary OIDC user info
5451+
* @param {*} [options] Override http request option.
5452+
* @throws {RequiredError}
5453+
* @memberof OIDCApi
5454+
*/
5455+
public oIDCUserInfoGet(options?: AxiosRequestConfig) {
5456+
return OIDCApiFp(this.configuration).oIDCUserInfoGet(options).then((request) => request(this.axios, this.basePath));
5457+
}
5458+
}
5459+
5460+
5461+
53315462
/**
53325463
* UsersApi - axios parameter creator
53335464
* @export

playground/connect-next/app/(no-auth)/login/WrappedLogin.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ const WrappedLogin = ({ clientState }: Props) => {
8282
}}
8383
onError={(error: string) => console.log('error', error)}
8484
onLoaded={(msg: string) => console.log('component has loaded: ' + msg)}
85-
onComplete={async (signedPasskeyData: string, newClientState: string) => {
85+
onComplete={async (signedPasskeyData: string, newClientState: string, webauthnId: string) => {
86+
console.log('webauthnId', webauthnId);
8687
await postPasskeyLoginNew(signedPasskeyData, newClientState);
8788
}}
8889
onSignupClick={() => router.push('/')}

0 commit comments

Comments
 (0)