mirror of
https://github.com/meteor/meteor.git
synced 2026-05-02 03:01:46 -04:00
OAuth login services use the new http sync api
This commit is contained in:
@@ -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 : ""));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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 : ""));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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 : ""));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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 : ""));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 : ""));
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user