Skip to content

Commit 8ad13a3

Browse files
committed
Add challenge endpoint
1 parent 80fb9bc commit 8ad13a3

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

src/ParseUser.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,32 @@ class ParseUser extends ParseObject {
782782
return user.linkWith(provider, options, saveOpts);
783783
}
784784

785+
/**
786+
* Ask Parse server for an auth challenge (ex: WebAuthn login/signup)
787+
*
788+
* @param data
789+
* @static
790+
* @returns {Promise}
791+
*/
792+
static challenge(data: {
793+
authData?: AuthData,
794+
username?: string,
795+
password?: string,
796+
challengeData: any,
797+
}): Promise<{ challengeData: any }> {
798+
if (!data.challengeData) {
799+
return Promise.reject(
800+
new ParseError(ParseError.OTHER_CAUSE, 'challengeData is required for the challenge.')
801+
);
802+
}
803+
if (data.username && !data.password) {
804+
return Promise.reject(
805+
new ParseError(ParseError.OTHER_CAUSE, 'Running challenge via username require password.')
806+
);
807+
}
808+
return CoreManager.getUserController().challenge(data);
809+
}
810+
785811
/**
786812
* Logs out the currently logged in user session. This will remove the
787813
* session from disk, log out of linked services, and future calls to
@@ -1153,6 +1179,10 @@ const DefaultController = {
11531179
});
11541180
},
11551181

1182+
challenge(data: any): Promise<{ challengeData: any }> {
1183+
return CoreManager.getRESTController().request('POST', 'challenge', data);
1184+
},
1185+
11561186
become(user: ParseUser, options: RequestOptions): Promise<ParseUser> {
11571187
const RESTController = CoreManager.getRESTController();
11581188
return RESTController.request('GET', 'users/me', {}, options).then(response => {

src/__tests__/ParseUser-test.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,4 +1881,49 @@ describe('ParseUser', () => {
18811881
const user = new CustomUser();
18821882
expect(user.test).toBe(true);
18831883
});
1884+
1885+
it('should return challenge', async () => {
1886+
ParseUser.enableUnsafeCurrentUser();
1887+
ParseUser._clearCache();
1888+
CoreManager.setRESTController({
1889+
request(method, path, body) {
1890+
expect(method).toBe('POST');
1891+
expect(path).toBe('challenge');
1892+
expect(body.username).toBe('username');
1893+
expect(body.password).toBe('password');
1894+
expect(body.challengeData).toEqual({ test: { data: true } });
1895+
1896+
return Promise.resolve(
1897+
{
1898+
challengeData: { test: { token: true } },
1899+
},
1900+
200
1901+
);
1902+
},
1903+
ajax() {},
1904+
});
1905+
1906+
try {
1907+
await ParseUser.challenge({
1908+
username: 'username',
1909+
challengeData: { test: { data: true } },
1910+
});
1911+
} catch (e) {
1912+
expect(e.message).toContain('Running challenge via username require password.');
1913+
}
1914+
1915+
try {
1916+
await ParseUser.challenge({});
1917+
} catch (e) {
1918+
expect(e.message).toContain('challengeData is required for the challenge.');
1919+
}
1920+
1921+
const res = await ParseUser.challenge({
1922+
username: 'username',
1923+
password: 'password',
1924+
challengeData: { test: { data: true } },
1925+
});
1926+
1927+
expect(res.challengeData).toEqual({ test: { token: true } });
1928+
});
18841929
});

0 commit comments

Comments
 (0)