Skip to content

Instantly share code, notes, and snippets.

@billyct
Forked from yongjhih/weibo.js
Created October 16, 2016 12:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save billyct/73837934801de72fb5ea165dc78984d4 to your computer and use it in GitHub Desktop.
Save billyct/73837934801de72fb5ea165dc78984d4 to your computer and use it in GitHub Desktop.
Weibo Parse Cloud
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: "abc@example.com" } ]
});
};
/**
* 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