From f6028b1578dee5698b0ab3b801bdafd3701ac5f2 Mon Sep 17 00:00:00 2001 From: Avital Oliver Date: Mon, 22 Apr 2013 12:33:37 -0700 Subject: [PATCH] OAuth login services use the new http sync api --- packages/accounts-facebook/facebook_server.js | 98 +++++++++---------- packages/accounts-github/github_server.js | 49 +++++----- packages/accounts-google/google_server.js | 50 +++++----- packages/accounts-meetup/meetup_server.js | 46 +++++---- .../accounts-oauth1-helper/oauth1_binding.js | 20 ++-- packages/accounts-weibo/weibo_server.js | 45 +++++---- 6 files changed, 155 insertions(+), 153 deletions(-) diff --git a/packages/accounts-facebook/facebook_server.js b/packages/accounts-facebook/facebook_server.js index a510887b87..3ca049453d 100644 --- a/packages/accounts-facebook/facebook_server.js +++ b/packages/accounts-facebook/facebook_server.js @@ -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 : "")); } }; diff --git a/packages/accounts-github/github_server.js b/packages/accounts-github/github_server.js index 1d712c2c89..d76f3deff4 100644 --- a/packages/accounts-github/github_server.js +++ b/packages/accounts-github/github_server.js @@ -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 : "")); } }; diff --git a/packages/accounts-google/google_server.js b/packages/accounts-google/google_server.js index bb8d482549..9ccb3b1c96 100644 --- a/packages/accounts-google/google_server.js +++ b/packages/accounts-google/google_server.js @@ -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 : "")); } }; diff --git a/packages/accounts-meetup/meetup_server.js b/packages/accounts-meetup/meetup_server.js index 56afbbb643..cab41746bb 100644 --- a/packages/accounts-meetup/meetup_server.js +++ b/packages/accounts-meetup/meetup_server.js @@ -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 : "")); } }; diff --git a/packages/accounts-oauth1-helper/oauth1_binding.js b/packages/accounts-oauth1-helper/oauth1_binding.js index 56d4a7d013..416e0ef9f4 100644 --- a/packages/accounts-oauth1-helper/oauth1_binding.js +++ b/packages/accounts-oauth1-helper/oauth1_binding.js @@ -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) { diff --git a/packages/accounts-weibo/weibo_server.js b/packages/accounts-weibo/weibo_server.js index 51d8215b0a..f8e9a1021b 100644 --- a/packages/accounts-weibo/weibo_server.js +++ b/packages/accounts-weibo/weibo_server.js @@ -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 : "")); } };