Support Google Play Games Service (#6147)
* Support Google Play Games Service * clean up * improve coverage * more tests
This commit is contained in:
@@ -5,6 +5,7 @@ const defaultColumns = require('../lib/Controllers/SchemaController')
|
|||||||
const authenticationLoader = require('../lib/Adapters/Auth');
|
const authenticationLoader = require('../lib/Adapters/Auth');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const responses = {
|
const responses = {
|
||||||
|
gpgames: { playerId: 'userId' },
|
||||||
instagram: { data: { id: 'userId' } },
|
instagram: { data: { id: 'userId' } },
|
||||||
janrainengage: { stat: 'ok', profile: { identifier: 'userId' } },
|
janrainengage: { stat: 'ok', profile: { identifier: 'userId' } },
|
||||||
janraincapture: { stat: 'ok', result: 'userId' },
|
janraincapture: { stat: 'ok', result: 'userId' },
|
||||||
@@ -22,6 +23,7 @@ describe('AuthenticationProviders', function() {
|
|||||||
[
|
[
|
||||||
'apple',
|
'apple',
|
||||||
'gcenter',
|
'gcenter',
|
||||||
|
'gpgames',
|
||||||
'facebook',
|
'facebook',
|
||||||
'facebookaccountkit',
|
'facebookaccountkit',
|
||||||
'github',
|
'github',
|
||||||
@@ -648,6 +650,37 @@ describe('google auth adapter', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('google play games service auth', () => {
|
||||||
|
const gpgames = require('../lib/Adapters/Auth/gpgames');
|
||||||
|
const httpsRequest = require('../lib/Adapters/Auth/httpsRequest');
|
||||||
|
|
||||||
|
it('validateAuthData should pass validation', async () => {
|
||||||
|
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||||
|
return Promise.resolve({ playerId: 'userId' });
|
||||||
|
});
|
||||||
|
await gpgames.validateAuthData({
|
||||||
|
id: 'userId',
|
||||||
|
access_token: 'access_token',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('validateAuthData should throw error', async () => {
|
||||||
|
spyOn(httpsRequest, 'get').and.callFake(() => {
|
||||||
|
return Promise.resolve({ playerId: 'invalid' });
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
await gpgames.validateAuthData({
|
||||||
|
id: 'userId',
|
||||||
|
access_token: 'access_token',
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
expect(e.message).toBe(
|
||||||
|
'Google Play Games Services - authData is invalid for this user.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('oauth2 auth adapter', () => {
|
describe('oauth2 auth adapter', () => {
|
||||||
const oauth2 = require('../lib/Adapters/Auth/oauth2');
|
const oauth2 = require('../lib/Adapters/Auth/oauth2');
|
||||||
const httpsRequest = require('../lib/Adapters/Auth/httpsRequest');
|
const httpsRequest = require('../lib/Adapters/Auth/httpsRequest');
|
||||||
|
|||||||
@@ -107,7 +107,10 @@ function verifySignature(publicKey, authData) {
|
|||||||
// Returns a promise that fulfills if this user id is valid.
|
// Returns a promise that fulfills if this user id is valid.
|
||||||
async function validateAuthData(authData) {
|
async function validateAuthData(authData) {
|
||||||
if (!authData.id) {
|
if (!authData.id) {
|
||||||
return Promise.reject('Apple Game Center - authData id missing');
|
throw new Parse.Error(
|
||||||
|
Parse.Error.OBJECT_NOT_FOUND,
|
||||||
|
'Apple Game Center - authData id missing'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
authData.playerId = authData.id;
|
authData.playerId = authData.id;
|
||||||
const publicKey = await getAppleCertificate(authData.publicKeyUrl);
|
const publicKey = await getAppleCertificate(authData.publicKeyUrl);
|
||||||
|
|||||||
33
src/Adapters/Auth/gpgames.js
Normal file
33
src/Adapters/Auth/gpgames.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/* Google Play Game Services
|
||||||
|
https://developers.google.com/games/services/web/api/players/get
|
||||||
|
|
||||||
|
const authData = {
|
||||||
|
id: 'playerId',
|
||||||
|
access_token: 'token',
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
const { Parse } = require('parse/node');
|
||||||
|
const httpsRequest = require('./httpsRequest');
|
||||||
|
|
||||||
|
// Returns a promise that fulfills if this user id is valid.
|
||||||
|
async function validateAuthData(authData) {
|
||||||
|
const response = await httpsRequest.get(
|
||||||
|
`https://www.googleapis.com/games/v1/players/${authData.id}?access_token=${authData.access_token}`
|
||||||
|
);
|
||||||
|
if (!(response && response.playerId === authData.id)) {
|
||||||
|
throw new Parse.Error(
|
||||||
|
Parse.Error.OBJECT_NOT_FOUND,
|
||||||
|
'Google Play Games Services - authData is invalid for this user.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a promise that fulfills if this app id is valid.
|
||||||
|
function validateAppId() {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
validateAppId,
|
||||||
|
validateAuthData,
|
||||||
|
};
|
||||||
@@ -2,6 +2,7 @@ import loadAdapter from '../AdapterLoader';
|
|||||||
|
|
||||||
const apple = require('./apple');
|
const apple = require('./apple');
|
||||||
const gcenter = require('./gcenter');
|
const gcenter = require('./gcenter');
|
||||||
|
const gpgames = require('./gpgames');
|
||||||
const facebook = require('./facebook');
|
const facebook = require('./facebook');
|
||||||
const facebookaccountkit = require('./facebookaccountkit');
|
const facebookaccountkit = require('./facebookaccountkit');
|
||||||
const instagram = require('./instagram');
|
const instagram = require('./instagram');
|
||||||
@@ -35,6 +36,7 @@ const anonymous = {
|
|||||||
const providers = {
|
const providers = {
|
||||||
apple,
|
apple,
|
||||||
gcenter,
|
gcenter,
|
||||||
|
gpgames,
|
||||||
facebook,
|
facebook,
|
||||||
facebookaccountkit,
|
facebookaccountkit,
|
||||||
instagram,
|
instagram,
|
||||||
|
|||||||
Reference in New Issue
Block a user