@ -0,0 +1,7 @@ | |||||
```bash | |||||
npm install fs --save | |||||
npm install unirest --save | |||||
npm install express --save | |||||
npm install passport --save | |||||
npm install passport-fitbit-oauth2 --save | |||||
``` |
@ -0,0 +1,6 @@ | |||||
{ | |||||
"port": 9000, | |||||
"clientID": "fit bit client id", | |||||
"clientSecret": "super secret", | |||||
"callbackURL": "https://jrtechs.student.rit.edu/auth/fitbit/callback" | |||||
} |
@ -0,0 +1,70 @@ | |||||
<!DOCTYPE html> | |||||
<html lang="en"> | |||||
<head> | |||||
<meta charset="UTF-8"> | |||||
<title>Title</title> | |||||
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> | |||||
</head> | |||||
<body> | |||||
<div class="row"> | |||||
<div class="col col-md-6 col-12"> | |||||
<script type='text/javascript' src='https://darksky.net/widget/graph-bar/43.1573,-77.6152/us12/en.js?width=100%&height=400&title=Full Forecast&textColor=333333&bgColor=transparent&transparency=true&skyColor=undefined&fontFamily=Default&customFont=&units=us&timeColor=333333&tempColor=333333¤tDetailsOption=true'></script> | |||||
<script type='text/javascript' src='https://darksky.net/widget/default/43.1573,-77.6152/us12/en.js?width=100%&height=350&title=Rochester NY&textColor=333333&bgColor=transparent&transparency=true&skyColor=undefined&fontFamily=Default&customFont=&units=us&htColor=333333<Color=C7C7C7&displaySum=yes&displayHeader=yes'></script> | |||||
</div> | |||||
<div class="col col-md-6 col-12"> | |||||
<!-- start sw-rss-feed code --> | |||||
<script type="text/javascript"> | |||||
rssfeed_url = new Array(); | |||||
rssfeed_url[0]="https://news.google.com/news/rss"; | |||||
rssfeed_frame_width="100%"; | |||||
rssfeed_frame_height="260"; | |||||
rssfeed_scroll="off"; | |||||
rssfeed_scroll_step="20"; | |||||
rssfeed_scroll_bar="on"; | |||||
rssfeed_target="_blank"; | |||||
rssfeed_font_size="12"; | |||||
rssfeed_font_face=""; | |||||
rssfeed_border="on"; | |||||
rssfeed_css_url=""; | |||||
rssfeed_title="on"; | |||||
rssfeed_title_name=""; | |||||
rssfeed_title_bgcolor="#3366ff"; | |||||
rssfeed_title_color="#fff"; | |||||
rssfeed_title_bgimage=""; | |||||
rssfeed_footer="off"; | |||||
rssfeed_footer_name="rss feed"; | |||||
rssfeed_footer_bgcolor="#fff"; | |||||
rssfeed_footer_color="#333"; | |||||
rssfeed_footer_bgimage=""; | |||||
rssfeed_item_title_length="50"; | |||||
rssfeed_item_title_color="#666"; | |||||
rssfeed_item_bgcolor="#fff"; | |||||
rssfeed_item_bgimage=""; | |||||
rssfeed_item_border_bottom="on"; | |||||
rssfeed_item_source_icon="off"; | |||||
rssfeed_item_date="off"; | |||||
rssfeed_item_description="on"; | |||||
rssfeed_item_description_length="120"; | |||||
rssfeed_item_description_color="#666"; | |||||
rssfeed_item_description_link_color="#333"; | |||||
rssfeed_item_description_tag="off"; | |||||
rssfeed_no_items="0"; | |||||
rssfeed_cache = "2220318b43254a73f6fcdb3732f0e710"; | |||||
</script> | |||||
<script type="text/javascript" src="//feed.surfing-waves.com/js/rss-feed.js"></script> | |||||
<!-- The link below helps keep this service FREE, and helps other people find the SW widget. Please be cool and keep it! Thanks. --> | |||||
<div style="color:#ccc;font-size:10px; text-align:right; width:100%;">powered by <a href="https://surfing-waves.com" rel="noopener" target="_blank" style="color:#ccc;">Surfing Waves</a></div> | |||||
<!-- end sw-rss-feed code --> | |||||
</div> | |||||
</div> | |||||
</body> | |||||
</html> |
@ -0,0 +1,95 @@ | |||||
/** express app */ | |||||
const express = require("express"); | |||||
/** Manages oauth 2.0 w/ fitbit */ | |||||
const passport = require('passport'); | |||||
/** Used to make API calls */ | |||||
const unirest = require('unirest'); | |||||
/** express app */ | |||||
const app = express(); | |||||
/** pull config file */ | |||||
const utils = require("./utils.js"); | |||||
const config = utils.getFileAsJSON("config.json"); | |||||
app.use(passport.initialize()); | |||||
app.use(passport.session({ | |||||
resave: false, | |||||
saveUninitialized: true | |||||
})); | |||||
var FitbitStrategy = require( 'passport-fitbit-oauth2' ).FitbitOAuth2Strategy; | |||||
var accessTokenTemp = null; | |||||
passport.use(new FitbitStrategy({ | |||||
clientID: config.clientID, | |||||
clientSecret: config.clientSecret, | |||||
callbackURL: config.callbackURL | |||||
}, | |||||
function(accessToken, refreshToken, profile, done) | |||||
{ | |||||
console.log(accessToken); | |||||
accessTokenTemp = accessToken; | |||||
done(null, { | |||||
accessToken: accessToken, | |||||
refreshToken: refreshToken, | |||||
profile: profile | |||||
}); | |||||
} | |||||
)); | |||||
passport.serializeUser(function(user, done) { | |||||
done(null, user); | |||||
}); | |||||
passport.deserializeUser(function(obj, done) { | |||||
done(null, obj); | |||||
}); | |||||
passport.authenticate('fitbit', { scope: ['activity','heartrate','location','profile'] }); | |||||
app.get('/auth/fitbit', | |||||
passport.authenticate('fitbit', { scope: ['activity','heartrate','location','profile'] } | |||||
)); | |||||
app.get( '/auth/fitbit/callback', passport.authenticate( 'fitbit', { | |||||
successRedirect: '/', | |||||
failureRedirect: '/error' | |||||
})); | |||||
app.get('/error', (request, result) => | |||||
{ | |||||
result.write("Error authenticating with Fitbit API"); | |||||
result.end(); | |||||
}); | |||||
app.get('/', (request, result) => | |||||
{ | |||||
if(accessTokenTemp == null) | |||||
{ | |||||
result.redirect('/auth/fitbit'); | |||||
} | |||||
unirest.get('https://api.fitbit.com/1/user/-/activities/steps/date/today/1m.json') | |||||
.headers({'Accept': 'application/json', 'Content-Type': 'application/json', Authorization: "Bearer " + accessTokenTemp}) | |||||
.end(function (response) | |||||
{ | |||||
// result.write(response.body); | |||||
result.end(); | |||||
console.log(response.body); | |||||
}); | |||||
}); | |||||
app.listen(PORT, () => | |||||
console.log(`App listening on port ${config.port}!`) | |||||
); |
@ -0,0 +1,20 @@ | |||||
const fs = require('fs'); | |||||
module.exports= | |||||
{ | |||||
/** | |||||
* | |||||
* @param fileName | |||||
* @returns {any} | |||||
*/ | |||||
getFileAsJSON: function(fileName) | |||||
{ | |||||
return JSON.parse(module.exports.getFile(fileName)); | |||||
}, | |||||
getFile: function(filename) | |||||
{ | |||||
return fs.readFileSync(filename, 'utf8'); | |||||
} | |||||
}; |