From 25d4ae461f78eaa9133a7336ca8c2b14d2957611 Mon Sep 17 00:00:00 2001 From: Alexis Kinsella Date: Sat, 26 May 2012 22:44:04 +0200 Subject: [PATCH 1/2] Add support for RunKeeper HealthGraph API --- .gitignore | 2 ++ README.md | 31 +++++++++++++++++++++++++++++++ example/conf.js | 4 ++++ example/server.js | 9 +++++++++ example/views/home.jade | 6 ++++++ lib/modules/runkeeper.js | 39 +++++++++++++++++++++++++++++++++++++++ media/runkeeper.ico | Bin 0 -> 1406 bytes 7 files changed, 91 insertions(+) create mode 100644 lib/modules/runkeeper.js create mode 100644 media/runkeeper.ico diff --git a/.gitignore b/.gitignore index 8a7afec5..1a565d03 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ issues IRC.md playground.js CHANGES +npm-debug.log +.idea \ No newline at end of file diff --git a/README.md b/README.md index ce8e5406..ad067ab3 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ So far, `everyauth` enables you to login via: Winfred Nadeau Mendeley Eduard Baun + RunKeeper + Alexis Kinsella Box.net @@ -2112,6 +2114,35 @@ connect( ).listen(3000); ``` +### RunKeeper OAuth (2.0) + +You will first need to [register your application](http://dev.mendeley.com/applications/register/) to get the consumer key and secret. + +```javascript +everyauth.mendeley + .consumerKey('YOUR CONSUMER KEY HERE') + .consumerSecret('YOUR CONSUMER SECRET HERE') + .findOrCreateUser( function (sess, accessToken, accessSecret, user) { + // find or create user logic goes here + // + // e.g., + // return usersByMendeleyId[user.main.profile_id] || (usersByMendeleyId[user.main.profile_id] = user); + }) + .redirectPath('/'); + +var routes = function (app) { + // Define your routes here +}; + +connect( + connect.bodyParser() + , connect.cookieParser() + , connect.session({secret: 'whodunnit'}) + , everyauth.middleware() + , connect.router(routes); +).listen(3000); +``` + ### OpenID protocol OpenID protocol allows you to use an openid auth request. You can read more information about it here http://openid.net/ diff --git a/example/conf.js b/example/conf.js index 6a28044a..ca20e5cf 100644 --- a/example/conf.js +++ b/example/conf.js @@ -116,4 +116,8 @@ module.exports = { consumerKey: 'Enter your consumer key here' , consumerSecret: 'Enter your consumer secret here' } + , runkeeper: { + appId: 'Enter your client/app id here' + , appSecret: 'Enter your client/app secret here' + } }; diff --git a/example/server.js b/example/server.js index bd6d0870..624961a2 100644 --- a/example/server.js +++ b/example/server.js @@ -51,6 +51,7 @@ var usersBySoundCloudId = {}; var usersByMailchimpId = {}; var usersMailruId = {}; var usersByMendeleyId = {}; +var usersByRunKeeperId = {}; var usersByLogin = { 'brian@example.com': addUser({ login: 'brian@example.com', password: 'password'}) }; @@ -379,6 +380,14 @@ everyauth.mendeley }) .redirectPath('/'); +everyauth.runkeeper + .appId(conf.runkeeper.appId) + .appSecret(conf.runkeeper.appSecret) + .findOrCreateUser(function(sess, accessToken, accessSecret, user) { + return usersByRunKeeperId[user.userID] || (usersByRunKeeperId[user.userID] = addUser('runkeeper', user)); + }) + .redirectPath('/'); + everyauth .soundcloud .appId(conf.soundcloud.appId) diff --git a/example/views/home.jade b/example/views/home.jade index 4b39cd68..9d966483 100644 --- a/example/views/home.jade +++ b/example/views/home.jade @@ -86,6 +86,9 @@ #mendeley-login a(href='/auth/mendeley', style='border: 0px') img(src='http://d1rktifm8krpj.cloudfront.net/graphics/commonnew/logo-mendeley_1248201417297118.png', title='Login with Mendeley') + #runkeeper-login + a(href='/auth/runkeeper', style='border: 0px') + img(src='http://d2b4ufapzmnxpw.cloudfront.net/build/3572/static/kronos/images/logo.png', title='Login with Runkeeper') #openid-login form#openid(action='/auth/openid') label(for='openid_identifier') OpenID Identifier:   @@ -177,5 +180,8 @@ - if (everyauth.mendeley) h3 Mendeley User Data p= JSON.stringify(everyauth.mendeley.user) + - if (everyauth.runkeeper) + h3 Runkeeper User Data + p= JSON.stringify(everyauth.runkeeper.user) h3 a(href='/logout') Logout diff --git a/lib/modules/runkeeper.js b/lib/modules/runkeeper.js new file mode 100644 index 00000000..895712a1 --- /dev/null +++ b/lib/modules/runkeeper.js @@ -0,0 +1,39 @@ +var oauthModule = require('./oauth2') + , request = require('request'); + +var runkeeper = module.exports = +oauthModule.submodule('runkeeper') + .configurable({ + scope: 'specify types of access: (no scope), non-expiring' + }) + .apiHost('https://api.runkeeper.com') + .oauthHost('https://runkeeper.com') + .authPath('/apps/authorize') + .accessTokenPath('/apps/token') + .entryPath('/auth/runkeeper') + .callbackPath('/auth/runkeeper/callback') + .authQueryParam('response_type', 'code') + .authQueryParam('scope', function () { + return this._scope && this.scope(); + }) + .accessTokenHttpMethod('post') + .postAccessTokenParamsVia('data') + .accessTokenParam('grant_type', 'authorization_code') + .fetchOAuthUser(function (accessToken) { + console.log("Access Token: ", accessToken); + var promise = this.Promise(); + request.get({ + url: this.apiHost() + '/user' + , headers: { + 'Authorization': 'Bearer ' + accessToken + } + }, function (err, res, body) { + if (err) return promise.fail(err); + if (parseInt(res.statusCode / 100, 10) !== 2) { + return promise.fail(body); + } + return promise.fulfill(JSON.parse(body)); + }); + + return promise; + }); diff --git a/media/runkeeper.ico b/media/runkeeper.ico new file mode 100644 index 0000000000000000000000000000000000000000..f5f98391f61e75d9fdfe71d973b240e7937b2f5d GIT binary patch literal 1406 zcmds$dr(wm7{(t$k}eQI0cOaabGW*!yBL^JO2PsH3!);(ZCUQu1-vAdm?elB2DpN- z%U%GN1$MdZa+8~(*l1SL4AV@v!I_$xYUnn>OgSLE*dO(O|8>s%&il?c^F7ae&-Wg{ zie3i?JbdzP0B7oah_xjiVFg?IK5YK3|LV1o4p4=&Xo+N@CI)f@&`MYgR%T+bK!nyk zEdIQ|jJAC&rmB-LQX;@esR;T5EDVY67&|P2A;}ZnX+F@W1)({Fhn5I8bY<*-CfWt_ zGefvD&JV+x1Gh41kDPe0&J zmjcQ#2HhEf=*{p$U$!6G3dE$%pf%PNmV63>Eofsxpnd{81n5h;Kfbfg!~UorE!&!$e&von<4McQK^T zkv4-KnIC%B$f7)me!`N=K^?`wbXpEwj4QM;3}($*y1z{rmJ4B#Z>NksNdG40CX5(A zBE)2koP4}-qb3`sR0h8-{0LL}X7muMaCgec391O14Z@VQ4Sy{DN*uK6Klz_`TaH|)F3?+9`4-3T(>_yJ7;-GpIeJ@ad)vWtRxkS=(1|Z4yf<*| zIj0w&eb@St^XGRtTH Date: Sat, 26 May 2012 22:49:33 +0200 Subject: [PATCH 2/2] Runkeeper documentation Update --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ad067ab3..a0a2ddd5 100644 --- a/README.md +++ b/README.md @@ -2116,17 +2116,17 @@ connect( ### RunKeeper OAuth (2.0) -You will first need to [register your application](http://dev.mendeley.com/applications/register/) to get the consumer key and secret. +You will first need to [register your application](http://runkeeper.com/partner/applications) to get the appId and appSecret. ```javascript -everyauth.mendeley - .consumerKey('YOUR CONSUMER KEY HERE') +everyauth.runkeeper + .appId('YOUR CONSUMER KEY HERE') .consumerSecret('YOUR CONSUMER SECRET HERE') .findOrCreateUser( function (sess, accessToken, accessSecret, user) { // find or create user logic goes here // // e.g., - // return usersByMendeleyId[user.main.profile_id] || (usersByMendeleyId[user.main.profile_id] = user); + // return usersByRunKeeperId[user.userID] || (usersByRunKeeperId[user.userID] = user); }) .redirectPath('/');