OAuth login services use the new http sync api

This commit is contained in:
Avital Oliver
2013-04-22 12:33:37 -07:00
parent a668166351
commit f6028b1578
6 changed files with 155 additions and 153 deletions

View File

@@ -45,63 +45,63 @@ var getTokenResponse = function (query) {
if (!config)
throw new Accounts.ConfigError("Service not configured");
// Request an access token
var result = Meteor.http.get(
"https://graph.facebook.com/oauth/access_token", {
params: {
client_id: config.appId,
redirect_uri: Meteor.absoluteUrl("_oauth/facebook?close"),
client_secret: config.secret,
code: query.code
}
});
var response = result.content;
if (result.error) {
throw new Error("Failed to complete OAuth handshake with Facebook. " +
"HTTP Error " + result.statusCode + ": " + response);
}
// Errors come back as JSON but success looks like a query encoded
// in a url
var error_response;
var responseContent;
try {
// Just try to parse so that we know if we failed or not,
// while storing the parsed results
error_response = JSON.parse(response);
} catch (e) {
error_response = null;
// Request an access token
responseContent = Meteor.http.get(
"https://graph.facebook.com/oauth/access_token", {
params: {
client_id: config.appId,
redirect_uri: Meteor.absoluteUrl("_oauth/facebook?close"),
client_secret: config.secret,
code: query.code
}
}).content;
} catch (err) {
throw new Error("Failed to complete OAuth handshake with Facebook. " +
err + (err.response ? ": " + err.response.content : ""));
}
if (error_response) {
throw new Error("Failed to complete OAuth handshake with Facebook. " + response);
} else {
// Success! Extract the facebook access token and expiration
// time from the response
var parsedResponse = querystring.parse(response);
var fbAccessToken = parsedResponse.access_token;
var fbExpires = parsedResponse.expires;
if (!fbAccessToken) {
throw new Error("Failed to complete OAuth handshake with facebook " +
"-- can't find access token in HTTP response. " + response);
// If 'responseContent' parses as JSON, it is an error.
(function () {
// Errors come back as JSON but success looks like a query encoded
// in a url
var errorResponse;
try {
// Just try to parse so that we know if we failed or not,
// while storing the parsed results
errorResponse = JSON.parse(responseContent);
} catch (e) {
errorResponse = null;
}
return {
accessToken: fbAccessToken,
expiresIn: fbExpires
};
if (errorResponse) {
throw new Error("Failed to complete OAuth handshake with Facebook. " + responseContent);
}
})();
// Success! Extract the facebook access token and expiration
// time from the response
var parsedResponse = querystring.parse(responseContent);
var fbAccessToken = parsedResponse.access_token;
var fbExpires = parsedResponse.expires;
if (!fbAccessToken) {
throw new Error("Failed to complete OAuth handshake with facebook " +
"-- can't find access token in HTTP response. " + responseContent);
}
return {
accessToken: fbAccessToken,
expiresIn: fbExpires
};
};
var getIdentity = function (accessToken) {
var result = Meteor.http.get("https://graph.facebook.com/me", {
params: {access_token: accessToken}});
if (result.error) {
try {
return Meteor.http.get("https://graph.facebook.com/me", {
params: {access_token: accessToken}}).data;
} catch (err) {
throw new Error("Failed to fetch identity from Facebook. " +
"HTTP Error " + result.statusCode + ": " + result.content);
} else {
return result.data;
err + (err.response ? ": " + err.response.content : ""));
}
};

View File

@@ -27,36 +27,37 @@ var getAccessToken = function (query) {
if (!config)
throw new Accounts.ConfigError("Service not configured");
var result = Meteor.http.post(
"https://github.com/login/oauth/access_token", {
headers: {Accept: 'application/json'},
params: {
code: query.code,
client_id: config.clientId,
client_secret: config.secret,
redirect_uri: Meteor.absoluteUrl("_oauth/github?close"),
state: query.state
}
});
if (result.error) { // if the http response was an error
var response;
try {
response = Meteor.http.post(
"https://github.com/login/oauth/access_token", {
headers: {Accept: 'application/json'},
params: {
code: query.code,
client_id: config.clientId,
client_secret: config.secret,
redirect_uri: Meteor.absoluteUrl("_oauth/github?close"),
state: query.state
}
});
} catch (err) {
throw new Error("Failed to complete OAuth handshake with GitHub. " +
"HTTP Error " + result.statusCode + ": " + result.content);
} else if (result.data.error) { // if the http response was a json object with an error attribute
throw new Error("Failed to complete OAuth handshake with GitHub. " + result.data.error);
err + (err.response ? ": " + err.response.content : ""));
}
if (response.data.error) { // if the http response was a json object with an error attribute
throw new Error("Failed to complete OAuth handshake with GitHub. " + response.data.error);
} else {
return result.data.access_token;
return response.data.access_token;
}
};
var getIdentity = function (accessToken) {
var result = Meteor.http.get(
"https://api.github.com/user",
{params: {access_token: accessToken}});
if (result.error) {
try {
return Meteor.http.get(
"https://api.github.com/user",
{params: {access_token: accessToken}}).data;
} catch (err) {
throw new Error("Failed to fetch identity from GitHub. " +
"HTTP Error " + result.statusCode + ": " + result.content);
} else {
return result.data;
err + (err.response ? ": " + err.response.content : ""));
}
};

View File

@@ -53,39 +53,39 @@ var getTokens = function (query) {
if (!config)
throw new Accounts.ConfigError("Service not configured");
var result = Meteor.http.post(
"https://accounts.google.com/o/oauth2/token", {params: {
code: query.code,
client_id: config.clientId,
client_secret: config.secret,
redirect_uri: Meteor.absoluteUrl("_oauth/google?close"),
grant_type: 'authorization_code'
}});
if (result.error) { // if the http response was an error
var response;
try {
response = Meteor.http.post(
"https://accounts.google.com/o/oauth2/token", {params: {
code: query.code,
client_id: config.clientId,
client_secret: config.secret,
redirect_uri: Meteor.absoluteUrl("_oauth/google?close"),
grant_type: 'authorization_code'
}});
} catch (err) {
throw new Error("Failed to complete OAuth handshake with Google. " +
"HTTP Error " + result.statusCode + ": " + result.content);
} else if (result.data.error) { // if the http response was a json object with an error attribute
throw new Error("Failed to complete OAuth handshake with Google. " + result.data.error);
err + (err.response ? ": " + err.response.content : ""));
}
if (response.data.error) { // if the http response was a json object with an error attribute
throw new Error("Failed to complete OAuth handshake with Google. " + response.data.error);
} else {
return {
accessToken: result.data.access_token,
refreshToken: result.data.refresh_token,
expiresIn: result.data.expires_in
accessToken: response.data.access_token,
refreshToken: response.data.refresh_token,
expiresIn: response.data.expires_in
};
}
};
var getIdentity = function (accessToken) {
var result = Meteor.http.get(
"https://www.googleapis.com/oauth2/v1/userinfo",
{params: {access_token: accessToken}});
if (result.error) {
try {
return Meteor.http.get(
"https://www.googleapis.com/oauth2/v1/userinfo",
{params: {access_token: accessToken}}).data;
} catch (err) {
throw new Error("Failed to fetch identity from Google. " +
"HTTP Error " + result.statusCode + ": " + result.content);
} else {
return result.data;
err + (err.response ? ": " + err.response.content : ""));
}
};

View File

@@ -26,33 +26,37 @@ var getAccessToken = function (query) {
if (!config)
throw new Accounts.ConfigError("Service not configured");
var result = Meteor.http.post(
"https://secure.meetup.com/oauth2/access", {headers: {Accept: 'application/json'}, params: {
code: query.code,
client_id: config.clientId,
client_secret: config.secret,
grant_type: 'authorization_code',
redirect_uri: Meteor.absoluteUrl("_oauth/meetup?close"),
state: query.state
}});
if (result.error) { // if the http response was an error
var response;
try {
response = Meteor.http.post(
"https://secure.meetup.com/oauth2/access", {headers: {Accept: 'application/json'}, params: {
code: query.code,
client_id: config.clientId,
client_secret: config.secret,
grant_type: 'authorization_code',
redirect_uri: Meteor.absoluteUrl("_oauth/meetup?close"),
state: query.state
}});
} catch (err) {
throw new Error("Failed to complete OAuth handshake with Meetup. " +
"HTTP Error " + result.statusCode + ": " + result.content);
} else if (result.data.error) { // if the http response was a json object with an error attribute
throw new Error("Failed to complete OAuth handshake with Meetup. " + result.data.error);
err + (err.response ? ": " + err.response.content : ""));
}
if (response.data.error) { // if the http response was a json object with an error attribute
throw new Error("Failed to complete OAuth handshake with Meetup. " + response.data.error);
} else {
return result.data.access_token;
return response.data.access_token;
}
};
var getIdentity = function (accessToken) {
var result = Meteor.http.get(
"https://secure.meetup.com/2/members",
{params: {member_id: 'self', access_token: accessToken}});
if (result.error) {
try {
var response = Meteor.http.get(
"https://secure.meetup.com/2/members",
{params: {member_id: 'self', access_token: accessToken}});
return response.data.results && response.data.results[0];
} catch (err) {
throw new Error("Failed to fetch identity from Meetup. " +
"HTTP Error " + result.statusCode + ": " + result.content);
} else {
return result.data.results && result.data.results[0];
err + (err.response ? ": " + err.response.content : ""));
}
};

View File

@@ -116,19 +116,17 @@ OAuth1Binding.prototype._call = function(method, url, headers, params) {
var authString = self._getAuthHeaderString(headers);
// Make signed request
var response = Meteor.http.call(method, url, {
params: params,
headers: {
Authorization: authString
}
});
if (response.error) {
try {
return Meteor.http.call(method, url, {
params: params,
headers: {
Authorization: authString
}
});
} catch (err) {
throw new Error("Failed to send OAuth1 http request to " + url + ". " +
"HTTP Error " + response.statusCode + ": " + response.content);
err + (err.response ? ": " + err.response.content : ""));
}
return response;
};
OAuth1Binding.prototype._encodeHeader = function(header) {

View File

@@ -40,40 +40,39 @@ var getTokenResponse = function (query) {
if (!config)
throw new Accounts.ConfigError("Service not configured");
var result = Meteor.http.post(
"https://api.weibo.com/oauth2/access_token", {params: {
code: query.code,
client_id: config.clientId,
client_secret: config.secret,
redirect_uri: Meteor.absoluteUrl("_oauth/weibo?close", {replaceLocalhost: true}),
grant_type: 'authorization_code'
}});
if (result.error) { // if the http response was an error
var response;
try {
response = Meteor.http.post(
"https://api.weibo.com/oauth2/access_token", {params: {
code: query.code,
client_id: config.clientId,
client_secret: config.secret,
redirect_uri: Meteor.absoluteUrl("_oauth/weibo?close", {replaceLocalhost: true}),
grant_type: 'authorization_code'
}});
} catch (err) {
throw new Error("Failed to complete OAuth handshake with Weibo. " +
"HTTP Error " + result.statusCode + ": " + result.content);
err + (err.response ? ": " + err.response.content : ""));
}
// result.headers["content-type"] is 'text/plain;charset=UTF-8', so
// the http package doesn't automatically populate result.data
result.data = JSON.parse(result.content);
response.data = JSON.parse(response.content);
if (result.data.error) { // if the http response was a json object with an error attribute
throw new Error("Failed to complete OAuth handshake with Weibo. " + result.data.error);
if (response.data.error) { // if the http response was a json object with an error attribute
throw new Error("Failed to complete OAuth handshake with Weibo. " + response.data.error);
} else {
return result.data;
return response.data;
}
};
var getIdentity = function (accessToken, userId) {
var result = Meteor.http.get(
"https://api.weibo.com/2/users/show.json",
{params: {access_token: accessToken, uid: userId}});
if (result.error) {
try {
return Meteor.http.get(
"https://api.weibo.com/2/users/show.json",
{params: {access_token: accessToken, uid: userId}}).data;
} catch (err) {
throw new Error("Failed to fetch identity from Weibo. " +
"HTTP Error " + result.statusCode + ": " + result.content);
} else {
return result.data;
err + (err.response ? ": " + err.response.content : ""));
}
};