Add beforeLogin trigger with support for auth providers (#5445)
* Add beforeLogin trigger with support for auth providers * adjust comment that boxed off beforeLogin to a negative use-case only * add internal error to help future maintainers regarding use of beforeLogin * let beforeLogin accept className or constructor like other hook types * add assertions for beforeLogin trigger className validation
This commit is contained in:
committed by
Arthur Cinader
parent
3e003ee9f4
commit
a1e1cef6d2
@@ -440,6 +440,22 @@ describe('Parse.User testing', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('should not call beforeLogin with become', async done => {
|
||||
const provider = getMockFacebookProvider();
|
||||
Parse.User._registerAuthenticationProvider(provider);
|
||||
|
||||
let hit = 0;
|
||||
Parse.Cloud.beforeLogin(() => {
|
||||
hit++;
|
||||
});
|
||||
|
||||
await Parse.User._logInWith('facebook');
|
||||
const sessionToken = Parse.User.current().getSessionToken();
|
||||
await Parse.User.become(sessionToken);
|
||||
expect(hit).toBe(0);
|
||||
done();
|
||||
});
|
||||
|
||||
it('cannot save non-authed user', async done => {
|
||||
let user = new Parse.User();
|
||||
user.set({
|
||||
@@ -1403,6 +1419,84 @@ describe('Parse.User testing', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('signup with provider should not call beforeLogin trigger', async done => {
|
||||
const provider = getMockFacebookProvider();
|
||||
Parse.User._registerAuthenticationProvider(provider);
|
||||
|
||||
let hit = 0;
|
||||
Parse.Cloud.beforeLogin(() => {
|
||||
hit++;
|
||||
});
|
||||
|
||||
await Parse.User._logInWith('facebook');
|
||||
expect(hit).toBe(0);
|
||||
done();
|
||||
});
|
||||
|
||||
it('login with provider should call beforeLogin trigger', async done => {
|
||||
const provider = getMockFacebookProvider();
|
||||
Parse.User._registerAuthenticationProvider(provider);
|
||||
|
||||
let hit = 0;
|
||||
Parse.Cloud.beforeLogin(req => {
|
||||
hit++;
|
||||
expect(req.object.get('authData')).toBeDefined();
|
||||
expect(req.object.get('name')).toBe('tupac shakur');
|
||||
});
|
||||
await Parse.User._logInWith('facebook');
|
||||
await Parse.User.current().save({ name: 'tupac shakur' });
|
||||
await Parse.User.logOut();
|
||||
await Parse.User._logInWith('facebook');
|
||||
expect(hit).toBe(1);
|
||||
done();
|
||||
});
|
||||
|
||||
it('incorrect login with provider should not call beforeLogin trigger', async done => {
|
||||
const provider = getMockFacebookProvider();
|
||||
Parse.User._registerAuthenticationProvider(provider);
|
||||
|
||||
let hit = 0;
|
||||
Parse.Cloud.beforeLogin(() => {
|
||||
hit++;
|
||||
});
|
||||
await Parse.User._logInWith('facebook');
|
||||
await Parse.User.logOut();
|
||||
provider.shouldError = true;
|
||||
try {
|
||||
await Parse.User._logInWith('facebook');
|
||||
} catch (e) {
|
||||
expect(e).toBeDefined();
|
||||
}
|
||||
expect(hit).toBe(0);
|
||||
done();
|
||||
});
|
||||
|
||||
it('login with provider should be blockable by beforeLogin', async done => {
|
||||
const provider = getMockFacebookProvider();
|
||||
Parse.User._registerAuthenticationProvider(provider);
|
||||
|
||||
let hit = 0;
|
||||
Parse.Cloud.beforeLogin(req => {
|
||||
hit++;
|
||||
if (req.object.get('isBanned')) {
|
||||
throw new Error('banned account');
|
||||
}
|
||||
});
|
||||
await Parse.User._logInWith('facebook');
|
||||
await Parse.User.current().save({ isBanned: true });
|
||||
await Parse.User.logOut();
|
||||
|
||||
try {
|
||||
await Parse.User._logInWith('facebook');
|
||||
throw new Error('should not have continued login.');
|
||||
} catch (e) {
|
||||
expect(e.message).toBe('banned account');
|
||||
}
|
||||
|
||||
expect(hit).toBe(1);
|
||||
done();
|
||||
});
|
||||
|
||||
it('link with provider', async done => {
|
||||
const provider = getMockFacebookProvider();
|
||||
Parse.User._registerAuthenticationProvider(provider);
|
||||
|
||||
Reference in New Issue
Block a user