From e4a7fbbf98822fd33f94be4848774c5f6bfe8e47 Mon Sep 17 00:00:00 2001 From: haifeizhang <363220933@qq.com> Date: Tue, 22 Nov 2016 21:30:31 +0800 Subject: [PATCH] add login with qq, wechat and weibo (#3069) * add login with qq, wechat and weibo * modify the code style, etc --- src/authDataManager/index.js | 8 ++++- src/authDataManager/qq.js | 47 +++++++++++++++++++++++++++ src/authDataManager/wechat.js | 41 ++++++++++++++++++++++++ src/authDataManager/weibo.js | 60 +++++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 1 deletion(-) mode change 100644 => 100755 src/authDataManager/index.js create mode 100644 src/authDataManager/qq.js create mode 100644 src/authDataManager/wechat.js create mode 100644 src/authDataManager/weibo.js diff --git a/src/authDataManager/index.js b/src/authDataManager/index.js old mode 100644 new mode 100755 index 2e439df2..f91a2462 --- a/src/authDataManager/index.js +++ b/src/authDataManager/index.js @@ -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: () => { @@ -33,7 +36,10 @@ let providers = { digits, janrainengage, janraincapture, - vkontakte + vkontakte, + qq, + wechat, + weibo } module.exports = function(oauthOptions = {}, enableAnonymousUsers = true) { diff --git a/src/authDataManager/qq.js b/src/authDataManager/qq.js new file mode 100644 index 00000000..23bec926 --- /dev/null +++ b/src/authDataManager/qq.js @@ -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 +}; diff --git a/src/authDataManager/wechat.js b/src/authDataManager/wechat.js new file mode 100644 index 00000000..288a8ca1 --- /dev/null +++ b/src/authDataManager/wechat.js @@ -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 +}; diff --git a/src/authDataManager/weibo.js b/src/authDataManager/weibo.js new file mode 100644 index 00000000..515c0772 --- /dev/null +++ b/src/authDataManager/weibo.js @@ -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 = { + 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){ + 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 +};