Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions demos/yahoo.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,26 @@ <h1>hello( yahoo )</h1>
<script class="pre">
function login(network){

var yahoo = hello(network);
var yahoo = hello(network);

yahoo.login().then(function(){
yahoo.login().then(function(){

// Get Profile
return yahoo.api('me');
}).then(function(p) {
document.getElementById('login').innerHTML = "<img src='"+ p.thumbnail + "' width=24/>Connected to "+ network+" as " + p.name;
}).then(null, function(e) {
console.error(e);
});
// Get Profile
return yahoo.api('me');
}).then(function(p) {
document.getElementById('login').innerHTML = "<img src='"+ p.thumbnail + "' width=24/>Connected to "+ network+" as " + p.name;
}).then(null, function(e) {
console.error(e);
});
}

// In the new implementation, the Yahoo client ID is not needed here
hello.init({
'yahoo' : YAHOO_CLIENT_ID
'yahoo': YAHOO_CLIENT_ID
},
{
redirect_uri:'../redirect.html',
oauth_proxy: OAUTH_PROXY_URL
redirect_uri:'../redirect.html',
oauth_proxy: OAUTH_PROXY_URL
});

</script>
</script>
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

207 changes: 49 additions & 158 deletions src/modules/yahoo.js
Original file line number Diff line number Diff line change
@@ -1,160 +1,51 @@
(function(hello) {

hello.init({

yahoo: {

// Ensure that you define an oauth_proxy
oauth: {
version: '1.0a',
auth: 'https://api.login.yahoo.com/oauth/v2/request_auth',
request: 'https://api.login.yahoo.com/oauth/v2/get_request_token',
token: 'https://api.login.yahoo.com/oauth/v2/get_token',
// Yahoo requires the state param to be base 64 encoded, hence the flag base64_state is set to true for Yahoo.
// Else uri encoding is used for all the other providers.
base64_state: true
},

// Login handler
login: function(p) {
// Change the default popup window to be at least 560
// Yahoo does dynamically change it on the fly for the signin screen (only, what if your already signed in)
p.options.popup.width = 560;

// Yahoo throws an parameter error if for whatever reason the state.scope contains a comma, so lets remove scope
try {delete p.qs.state.scope;}
catch (e) {}
},

base: 'https://social.yahooapis.com/v1/',

get: {
me: yql('select * from social.profile(0) where guid=me'),
'me/friends': yql('select * from social.contacts(0) where guid=me'),
'me/following': yql('select * from social.contacts(0) where guid=me')
},
wrap: {
me: formatUser,

// Can't get IDs
// It might be better to loop through the social.relationship table with has unique IDs of users.
'me/friends': formatFriends,
'me/following': formatFriends,
'default': paging
}
}
});

/*
// Auto-refresh fix: bug in Yahoo can't get this to work with node-oauth-shim
login : function(o){
// Is the user already logged in
var auth = hello('yahoo').getAuthResponse();

// Is this a refresh token?
if(o.options.display==='none'&&auth&&auth.access_token&&auth.refresh_token){
// Add the old token and the refresh token, including path to the query
// See http://developer.yahoo.com/oauth/guide/oauth-refreshaccesstoken.html
o.qs.access_token = auth.access_token;
o.qs.refresh_token = auth.refresh_token;
o.qs.token_url = 'https://api.login.yahoo.com/oauth/v2/get_token';
}
},
*/

function formatError(o) {
if (o && 'meta' in o && 'error_type' in o.meta) {
o.error = {
code: o.meta.error_type,
message: o.meta.error_message
};
}
}

function formatUser(o) {

formatError(o);
if (o.query && o.query.results && o.query.results.profile) {
o = o.query.results.profile;
o.id = o.guid;
o.last_name = o.familyName;
o.first_name = o.givenName || o.nickname;
var a = [];
if (o.first_name) {
a.push(o.first_name);
}

if (o.last_name) {
a.push(o.last_name);
}

o.name = a.join(' ');
o.email = (o.emails && o.emails[0]) ? o.emails[0].handle : null;
o.thumbnail = o.image ? o.image.imageUrl : null;
}

return o;
}

function formatFriends(o, headers, request) {
formatError(o);
paging(o, headers, request);
var contact;
var field;
if (o.query && o.query.results && o.query.results.contact) {
o.data = o.query.results.contact;
delete o.query;

if (!Array.isArray(o.data)) {
o.data = [o.data];
}

o.data.forEach(formatFriend);
}

return o;
}

function formatFriend(contact) {
contact.id = null;

// #362: Reports of responses returning a single item, rather than an Array of items.
// Format the contact.fields to be an array.
if (contact.fields && !(contact.fields instanceof Array)) {
contact.fields = [contact.fields];
}

(contact.fields || []).forEach(function(field) {
if (field.type === 'email') {
contact.email = field.value;
}

if (field.type === 'name') {
contact.first_name = field.value.givenName;
contact.last_name = field.value.familyName;
contact.name = field.value.givenName + ' ' + field.value.familyName;
}

if (field.type === 'yahooid') {
contact.id = field.value;
}
});
}

function paging(res, headers, request) {

// See: http://developer.yahoo.com/yql/guide/paging.html#local_limits
if (res.query && res.query.count && request.options) {
res.paging = {
next: '?start=' + (res.query.count + (+request.options.start || 1))
};
}

return res;
}

function yql(q) {
return 'https://query.yahooapis.com/v1/yql?q=' + (q + ' limit @{limit|100} offset @{start|0}').replace(/\s/g, '%20') + '&format=json';
}

})(hello);
hello.init({
yahoo: {
// Updated to modern OAuth 2.0 authentication flow
oauth: {
version: 2,
auth: 'https://api.login.yahoo.com/oauth2/request_auth',
grant: 'https://api.login.yahoo.com/oauth2/get_token'
},

// Modern Yahoo API requires a different scope format
scope: {
basic: 'openid profile email'
},

// The `base` URL now points to the new user info endpoint.
base: 'https://api.login.yahoo.com/openid/v1/userinfo',

// Login handler
login: function(p) {
// Yahoo requires the state param to be base 64 encoded.
p.qs.base64_state = true;
},

// API methods to get user data
get: {
me: 'https://api.login.yahoo.com/openid/v1/userinfo'
},

// Wrapper to handle the new data format from the `userinfo` endpoint
wrap: {
me: formatUser
}
}
});

// Helper function to format user data
function formatUser(o) {
if (o.sub) {
o.id = o.sub;
o.name = o.name;
o.first_name = o.given_name;
o.last_name = o.family_name;
o.email = o.email;
o.thumbnail = o.picture;
}
return o;
}

})(hello);