Skip to content

add login with qq, wechat and weibo #3069

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 22, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/authDataManager/index.js
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ let digits = require("./twitter"); // digits tokens are validated by twitter
let janrainengage = require("./janrainengage");
let janraincapture = require("./janraincapture");
let vkontakte = require("./vkontakte");
let qq = require("./qq");
let wechat = require("./wechat");
let weibo = require("./weibo");

let anonymous = {
validateAuthData: () => {
Expand All @@ -33,7 +36,10 @@ let providers = {
digits,
janrainengage,
janraincapture,
vkontakte
vkontakte,
qq,
wechat,
weibo
}

module.exports = function(oauthOptions = {}, enableAnonymousUsers = true) {
Expand Down
47 changes: 47 additions & 0 deletions src/authDataManager/qq.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Helper functions for accessing the qq Graph API.
var https = require('https');
var Parse = require('parse/node').Parse;

// Returns a promise that fulfills iff this user id is valid.
function validateAuthData(authData) {
return graphRequest('me?access_token=' + authData.access_token).then(function (data) {
if (data && data.openid == authData.id) {
return;
}
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq auth is invalid for this user.');
});
}

// Returns a promise that fulfills if this app id is valid.
function validateAppId(appIds, authData) {
return Promise.resolve();
}

// A promisey wrapper for qq graph requests.
function graphRequest(path) {
return new Promise(function (resolve, reject) {
https.get('https://graph.qq.com/oauth2.0/' + path, function (res) {
var data = '';
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
var starPos=data.indexOf("(");
var endPos=data.indexOf(")");
if(starPos==-1||endPos==-1){
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq auth is invalid for this user.');
}
data=data.substring(starPos+1,endPos-1);
data = JSON.parse(data);
resolve(data);
});
}).on('error', function (e) {
reject('Failed to validate this access token with qq.');
});
});
}

module.exports = {
validateAppId,
validateAuthData
};
41 changes: 41 additions & 0 deletions src/authDataManager/wechat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Helper functions for accessing the WeChat Graph API.
var https = require('https');
var Parse = require('parse/node').Parse;

// Returns a promise that fulfills iff this user id is valid.
function validateAuthData(authData) {
return graphRequest('auth?access_token=' + authData.access_token +'&openid=' +authData.id).then(function (data) {
if (data.errcode == 0) {
return;
}
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'qq auth is invalid for this user.');
});
}

// Returns a promise that fulfills if this app id is valid.
function validateAppId(appIds, authData) {
return Promise.resolve();
}

// A promisey wrapper for WeChat graph requests.
function graphRequest(path) {
return new Promise(function (resolve, reject) {
https.get('https://api.weixin.qq.com/sns/' + path, function (res) {
var data = '';
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
data = JSON.parse(data);
resolve(data);
});
}).on('error', function (e) {
reject('Failed to validate this access token with weixin.');
});
});
}

module.exports = {
validateAppId,
validateAuthData
};
60 changes: 60 additions & 0 deletions src/authDataManager/weibo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// Helper functions for accessing the weibo Graph API.
var https = require('https');
var Parse = require('parse/node').Parse;
var querystring = require('querystring');

// Returns a promise that fulfills iff this user id is valid.
function validateAuthData(authData) {
return graphRequest(authData.access_token).then(function (data) {
if (data && data.uid == authData.id) {
return;
}
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'weibo auth is invalid for this user.');
});
}

// Returns a promise that fulfills if this app id is valid.
function validateAppId(appIds, authData) {
return Promise.resolve();
}

// A promisey wrapper for weibo graph requests.
function graphRequest(access_token) {
return new Promise(function (resolve, reject) {
var postData = querystring.stringify({
"access_token":access_token
});
var options = {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use const

hostname: 'api.weibo.com',
path: '/oauth2/get_token_info',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
var req = https.request(options, function(res){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use const

var data = '';
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
data = JSON.parse(data);
resolve(data);
});
res.on('error', function (err) {
reject('Failed to validate this access token with weibo.');
});
});
req.on('error', function (e){
reject('Failed to validate this access token with weibo.');
});
req.write(postData);
req.end();
});
}

module.exports = {
validateAppId,
validateAuthData
};