Last active
February 9, 2019 09:39
-
-
Save yongjhih/e196e01fc7da9c03ce7e to your computer and use it in GitHub Desktop.
Weibo Parse Cloud
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function s4() { | |
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); | |
}; | |
function guid() { | |
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + | |
s4() + '-' + s4() + s4() + s4(); | |
}; | |
function guid20() { | |
return s4() + s4() + s4() + s4() + s4(); | |
}; | |
/** | |
* Returns email | |
* | |
* @param {String} accessToken | |
* @returns {Promise<String>} email | |
*/ | |
function getEmail(accessToken) { | |
return Parse.Cloud.httpRequest({ | |
url: "https://api.weibo.com/2/account/profile/email.json", | |
params: { | |
access_token: accessToken | |
} | |
}).then(function (httpResponse) { | |
return JSON.parse(httpResponse.text)[0].email; // [ { email: "[email protected]" } ] | |
}); | |
}; | |
/** | |
* Returns uid. | |
* | |
* @param {String} accessToken | |
* @returns {Promise<String>} uid | |
*/ | |
function getUid(accessToken) { | |
return Parse.Cloud.httpRequest({ | |
url: "https://api.weibo.com/2/account/get_uid.json", | |
params: { | |
access_token: accessToken | |
} | |
}).then(function (httpResponse) { | |
return JSON.parse(httpResponse.text).uid; // { uid: 5647447265 } | |
}); | |
} | |
/** | |
* Returns email. | |
* | |
* @param {String} accessToken | |
* @returns {Promise<String>} email | |
*/ | |
function getEmailAlternative(accessToken) { | |
var WEIBO_COM = "weibo.com"; | |
return getEmail(accessToken).then(function (email) { | |
if (!email) return Parse.Promise.error("Invalid email"); | |
return Parse.Promise.as(email); | |
}, function (error) { | |
return getUid(accessToken).then(function (uid) { | |
return Parse.Promise.as(uid + "@" + WEIBO_COM); | |
}); | |
}); | |
} | |
/** | |
* Returns the session token of available parse user via weibo access token within `request.params.accessToken`. | |
* | |
* @param {Object} request Require request.params.accessToken | |
* @param {Object} response | |
* @returns {String} sessionToken | |
*/ | |
function signInWithWeibo(request, response) { | |
promiseResponse(signInWithWeiboPromise(request.user, request.params.accessToken, request.params.expiresTime), response); | |
} | |
// TODO Move to parses.js | |
function promiseResponse(promise, response) { | |
promise.then(function (obj) { | |
response.success(obj); | |
}, function (error) { | |
response.error(error); | |
}) | |
} | |
/** | |
* Returns the session token of available parse user via weibo access token. | |
* | |
* @param {Parse.User} user | |
* @param {String} accessToken | |
* @param {Number} expiresTime | |
* @returns {Promise<String>} sessionToken | |
*/ | |
function signInWithWeiboPromise(user, accessToken, expiresTime) { | |
Parse.Cloud.useMasterKey(); | |
var userPromise; | |
if (user) { // login | |
userPromise = Parse.Promise.as(user); | |
} else { // not login | |
if (!accessToken) { | |
return Parse.Promise.error("Require accessToken parameter"); | |
} | |
userPromise = getEmailAlternative(accessToken).then(function (email) { | |
if (!email) return Parse.Promise.error("Invalid email"); | |
var userQuery = new Parse.Query(Parse.User); | |
userQuery.equalTo("email", email); | |
return userQuery.first().then(function (user) { | |
if (user) return Parse.Promise.when(Parse.Promise.as(user), Parse.Promise.as(null)); | |
return Parse.Promise.when(Parse.Promise.as(user), getUid(accessToken)); | |
}).then(function (user, uid) { | |
if (user) return Parse.Promise.when(Parse.Promise.as(user), Parse.Promise.as(uid)); | |
var weiboQuery = new Parse.Query(Parse.User); | |
weiboQuery.equalTo("weiboUid", uid.toString()); | |
return Parse.Promise.when(weiboQuery.first(), Parse.Promise.as(uid)); | |
}).then(function (user, uid) { | |
if (user) return Parse.Promise.as(user); | |
var newUser = new Parse.User(); | |
var username = "weibo" + guid20(); | |
var password = "weibo" + guid20(); | |
newUser.setUsername(username); | |
newUser.setPassword(password); | |
newUser.setEmail(email); | |
var attrs = { | |
// exception: {"code":251,"message":"custom credential verification for auth service weibo failed"} | |
//"authData": { | |
// "weibo": { | |
// "id": uid, | |
// "access_token": accessToken, | |
// "expires_time": expiresTime | |
// } | |
//}, | |
weiboUid: uid.toString() | |
}; | |
return newUser.signUp(attrs); | |
}); | |
}); | |
} | |
return userPromise.then(function (user) { | |
return user.fetch(); | |
}).then(function (user) { | |
if (user) { | |
return Parse.Promise.as(user._sessionToken); // getSessionToken()? | |
} else { | |
return Parse.Promise.error("Weibo user not found"); | |
} | |
}); | |
}; | |
/** | |
* @param {function(request, response)} func | |
*/ | |
// TODO Move to parses.js | |
function defineParseCloud(func) { | |
Parse.Cloud.define(func.name, func); | |
} | |
defineParseCloud(signInWithWeibo); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment