social-oauth-client
Version:
Login with open platforms list Google, Facebook, Twitter, Github & ...
572 lines (445 loc) • 15.3 kB
Markdown
Social OAuth Client
===========================
OAuth wrapper to easily adapt social login using Restful on each platforms.
## Features
* get OAuth tokens & basic info for each platforms.
* Platforms
* Facebook
* Google
* Twitter
* GitHub
* Disqus
* Instagram
* Naver
* Kakao
* Dropbox
* Tumblr - OAuth1
* Flickr - OAuth1
* Wordpress
## Installation
```bash
# 1. install social-oauth-client
$ npm install social-oauth-client
```
## Usage
> Social login require browser activities like URL redirect or callback url. So, demo use Express server to receive callback.
> Each social platform needs to register application for OAuth login.
### Google
```javascript
'use strict';
var express = require('express');
var app = express();
// require social-oauth-client
var soc = require('social-oauth-client');
// get instance for Google (REPLACE WITH YOUR OWN APP SETTINGS)
var google = new soc.Google({
"CLIENT_ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
"CLIENT_ID": "xxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
"CLIENT_SECRET": "xxxxxxxxxxxxxxxx-oOQnFM2",
"REDIRECT_URL": "http://test.com:3000/google_callback"
});
// go to Google authorize page
app.get('/google_authorize', function (req, res) {
var url = google.getAuthorizeUrl(); // default scope 'https://www.googleapis.com/auth/plus.me'
// var url = google.getAuthorizeUrl(['https://www.googleapis.com/auth/plus.me', 'https://www.googleapis.com/auth/calendar']);
res.redirect(url);
});
// Google OAuth redirection url
app.get('/google_callback', function (req, res) {
// delegate to social-oauth-client
google.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
console.log(JSON.stringify(user));
/*
{
"tokens": {
"access_token": "xxxx.JAIbzLcX14pZh9O1epjw_6vqtsTnJDgBc1tcVlNQE1D5sHoTiStfzdaUmEjUWECxXywa",
"token_type": "Bearer",
"id_token": "xxxxxxxxxxJSUzI1NiIsImtpZCI6ImJlMzRkYWU0MDkwMmZlNzNhNTlhMTc2NDJjM2U3ODBiNDA0MWRiODUifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXRfaGFzaCI6IjVSX2pjWFFHMjFVYS1BZzRBUFJ6Z0EiLCJhdWQiOiI0NzI4NzcyMjgwNDUta2RlOWx0NHMwaG1zbThlbGY0YmhqY2VqOHA5dTU2MDMuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMDIwMjk4MDQzMDc3NDAzOTQ4OTciLCJhenAiOiI0NzI4NzcyMjgwNDUta2RlOWx0NHMwaG1zbThlbGY0YmhqY2VqOHA5dTU2MDMuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJpYXQiOjE0NDY4MDU0NjIsImV4cCI6MTQ0NjgwOTA2Mn0.RLj5XT66cBWA959BYFEbzkh57MU56Q318MVPts8uJ1hewMDuLEUpX1tMnW_RR2uYiBfDMa20vUOmjqH-vm1NVy-4QaHS3g4IfwSf0OHD8Gcf_jHkt_sMet4DUbddcQ6uxYYqnwfpa90SErK8pZkeQxCQq04hXOdDRfrjP6Kf9HoS62MN5K0u1umT_Un6p57tW8DdFI70vOuyaDL0teONiNa13_XChIHOeGbYy3lTr4S7baT1gV7Se9fDDuqP1Ia1yjBYWpV3wx-5nn8DroR1qqZ6_qn1fEjmMNEFMap2FNDpPt-rwMBZq9o5he_E3C4jEwmLkCJPX44AD6MEp7sOHA",
"refresh_token": "1/GHIW3jESUOrrOU63WyW7JSmR378LMsHUyHZIEYmLaaxIgOrJDtdun6xxxxxxxxxx",
"expiry_date": 1446809062917
},
"info": {
"kind": "plus#person",
"etag": "\"MrhFVuKLF7zHXL6gE2l7cEdzuiA/_1F2ElmGLMw94CqwVNkhAcT9ieM\"",
"gender": "male",
"objectType": "person",
"id": "102029804307740394897",
"displayName": "박종순",
"name": {
"familyName": "박",
"givenName": "종순"
},
"url": "https://plus.google.com/+박종순",
"image": {
"url": "https://lh6.googleusercontent.com/-RNto1FAc5WE/AAAAAAAAAAI/AAAAAAAAAdo/0j7f4c_qY9Q/photo.jpg?sz=50",
"isDefault": false
},
"isPlusUser": true,
"circledByCount": 624,
"verified": false
},
"key": "GOOGLE_102029804307740394897",
"platform": "GOOGLE"
}
*/
res.send(user);
}, function(err) {
res.send(err);
});
});
app.get('/', function (req, res) {
var demo = '<h2>Social OAuth Client Demo!</h2>';
demo+= '<a href="/google_authorize">Google</a><br/>';
res.send(demo);
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
```
### Facebook
```javascript
...
// require social-oauth-client
var soc = require('social-oauth-client');
// Facebook (REPLACE WITH YOUR OWN APP SETTINGS)
var facebook = new soc.Facebook( {
"APP_ID": "xxxxxxxxxx845827",
"APP_SECRET": "xxxxxxxxxxb6cf8fc6a1a43efb78deff",
"CLIENT_ID": "xxxxxxxxxxbb9c0a2e597bdbaef07a9d",
"REDIRECT_URL": "http://js.2do.kr:10000/service/oauth/facebook_callback"
});
// go to Facebook authorize page
app.get('/facebook_authorize', function (req, res) {
var url = facebook.getAuthorizeUrl(); // default scope public_profile
// var url = facebook.getAuthorizeUrl(['user_likes','email','user_events']);
res.redirect(url);
});
// Facebook OAuth redirection url
app.get('/service/oauth/facebook_callback', function (req, res) {
// delegate to social-oauth-client
facebook.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### Twitter
```javascript
...
// require social-oauth-client
var soc = require('social-oauth-client');
// Twitter (REPLACE WITH YOUR OWN APP SETTINGS)
var twitter = new soc.Twitter({
"CONSUMER_KEY": "xxxxxxxxxxyb4UWW4t0kARqT6",
"CONSUMER_SECRET": "xxxxxxxxxxdSf47fyfj6pfcXjRMtwa8F9oOBgnb2bXIRf0Dawl",
"REDIRECT_URL": "http://js.2do.kr:10000/service/oauth/twitter_callback"
});
// go to Twitter authorize page
app.get('/twitter_authorize', function (req, res) {
// twitter OAuth scope is managed by management console.
var url = twitter.getAuthorizeUrl().then(function(url) {
res.redirect(url);
}, function(err) {
res.send(err);
});
});
// Twitter OAuth redirection url
app.get('/service/oauth/twitter_callback', function (req, res) {
// delegate to social-oauth-client
twitter.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### GitHub
```javascript
...
// require social-oauth-client
var soc = require('social-oauth-client');
// GitHub (REPLACE WITH YOUR OWN APP SETTINGS)
var github = new soc.GitHub({
"CLIENT_ID": "xxxxxxxxxxe06f8939ff",
"CLIENT_SECRET": "xxxxxxxxxxebb7b3c74cc2e52245f4991338818f"
});
// go to GitHub authorize page
app.get('/github_authorize', function (req, res) {
var url = github.getAuthorizeUrl(); // default scope "user"
// var url = github.getAuthorizeUrl(['repo', 'gist']);
res.redirect(url);
});
// GitHub OAuth redirection url
app.get('/service/oauth/github_callback', function (req, res) {
// delegate to social-oauth-client
github.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### DISQUS
```javascript
...
// require social-oauth-client
var soc = require('social-oauth-client');
// DISQUS (REPLACE WITH YOUR OWN APP SETTINGS)
var disqus = new soc.Disqus({
"API_KEY": "KKZyiA1EexxxxxxxxZWnOKoXuKWlKt9SSALYaN40P7rvOw65my6QpbbymWCxSFHZ",
"API_SECRET": "vihYOhS7xit7IAAvFvayyxkPkWuhHc1Qa0HXYQCUVWvvxxxxxCHgpc4DUnxTB9pn",
"REDIRECT_URL": "http://js.2do.kr:10000/service/oauth/disqus_callback"
});
// go to DISQUS authorize page
app.get('/disqus_authorize', function (req, res) {
var url = disqus.getAuthorizeUrl(); // default scope "read"
// var url = disqus.getAuthorizeUrl(['read', 'write']);
res.redirect(url);
});
// DISQUS OAuth redirection url
app.get('/service/oauth/disqus_callback', function (req, res) {
// delegate to social-oauth-client
disqus.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### Instagram
```javascript
...
// Instagram (REPLACE WITH YOUR OWN APP SETTINGS)
var instagram = new soc.Instagram({
"CLIENT_ID": "0ce5dc2f82d146fxxxxxx7e12a7c07e4",
"CLIENT_SECRET": "a04b226xxxxx4d6ab747129c83427223",
"REDIRECT_URL": "http://js.2do.kr:10000/service/oauth/instagram_callback"
});
// go to Instagram authorize page
app.get('/instagram_authorize', function (req, res) {
var url = instagram.getAuthorizeUrl(); // default scope "public_content"
// var url = instagram.getAuthorizeUrl(['follower_list', 'likes']);
res.redirect(url);
});
// Instagram redirection url
app.get('/service/oauth/instagram_callback', function (req, res) {
// delegate to social-auth-client
instagram.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### Naver
```javascript
...
// Naver OAuth 2.0 (REPLACE WITH YOUR OWN APP SETTINGS)
// https://nid.naver.com/devcenter/main.nhn
var naver = new soc.Naver({
"CLIENT_ID": "rCcjmpJshawqaB7RXXXX",
"CLIENT_SECRET": "IT32xxxxIw",
"REDIRECT_URL": "http://js.2do.kr:3005/service/oauth/naver_callback"
});
// go to Naver authorize page
app.get('/naver_authorize', function (req, res) {
var url = naver.getAuthorizeUrl();
// res.send(url);
res.redirect(url);
});
// Naver redirection url
app.get('/service/oauth/naver_callback', function (req, res) {
// delegate to social-auth-client
naver.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### Kakao
```javascript
...
// Kakao (REPLACE WITH YOUR OWN APP SETTINGS)
var kakao = new soc.Kakao({
"REST_KEY": "e4c4519465b273191afdc001c0xxxxxx",
"JAVASCRIPT_KEY": "a2c96aac53647a69xxxxxx6eaf4cf190",
"REDIRECT_URL": "http://js.2do.kr:3005/service/oauth/kakao_callback"
});
// go to Kakao authorize page
app.get('/kakao_authorize', function (req, res) {
var url = kakao.getAuthorizeUrl();
res.redirect(url);
});
// Kakao redirection url
app.get('/service/oauth/kakao_callback', function (req, res) {
// delegate to social-auth-client
kakao.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### Dropbox
```javascript
...
// Dropbox (REPLACE WITH YOUR OWN APP SETTINGS)
var dropbox = new soc.Dropbox({
"CLIENT_ID": "hlyuxxxxxxxxdbk",
"CLIENT_SECRET": "lxvg1xxxxxnbxr7",
"REDIRECT_URL": "https://js.2do.kr/service/oauth/dropbox_callback"
});
// go to Dropbox authorize page
app.get('/dropbox_authorize', function (req, res) {
// Dropbox OAuth scope is managed by management console.
var url = dropbox.getAuthorizeUrl();
res.redirect(url);
});
// Dropbox OAuth redirection url
app.get('/service/oauth/dropbox_callback', function (req, res) {
// delegate to social-auth-client
dropbox.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### Tumblr - OAuth1
```javascript
...
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser'); // for temporary oauth_token_secret saving
app.use(cookieParser());
// require social-auth-client
var soc = require('social-oauth-client');
// Tumblr (REPLACE WITH YOUR OWN APP SETTINGS)
var tumblr = new soc.Tumblr({
"CONSUMER_KEY": "ga9wlssygga4yZGqOHA5EyxxxxxtHgLBpp17ZOql2TWqdchVUc",
"CONSUMER_SECRET": "KhwFS7dN3JakU4mnXsxxxxxzMa38WDTMSQ09zRzgODbKy20gz6",
"REDIRECT_URL": "http://js.2do.kr:3005/service/oauth/tumblr_callback"
});
// go to Tumblr authorize page
app.get('/tumblr_authorize', function (req, res) {
var url = tumblr.getAuthorizeUrl().then(function(o) {
// save oauth_token_secret to cookie temporary
var cookieDomain = '.2do.kr';
res.cookie('token_secret', o.token.oauth_token_secret, {domain: cookieDomain, path: '/'});
res.redirect(o.url);
}, function(err) {
res.send(err);
});
});
// Tumblr OAuth redirection url
app.get('/service/oauth/tumblr_callback', function (req, res) {
// pass oauth_token_secret from cookie
req.query.token_secret = req.cookies.token_secret;
// delegate to social-auth-client
tumblr.callback(req, res).then(function(user) {
// delete temporary oauth_token_secret from cookie
var cookieDomain = '.2do.kr';
res.cookie('token_secret', '', {domain: cookieDomain, path: '/', expires: new Date(Date.now() - 1000)});
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
### Flickr - OAuth1
```javascript
...
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser'); // for temporary oauth_token_secret saving
app.use(cookieParser());
// require social-auth-client
var soc = require('social-oauth-client');
// Flickr (REPLACE WITH YOUR OWN APP SETTINGS)
var flickr = new soc.Flickr({
"CONSUMER_KEY": "5191b2bfecf2dcfxxxxxxxxxe7452e90",
"CONSUMER_SECRET": "0ecf4c8xxxx82dc7",
"REDIRECT_URL": "http://js.2do.kr:3005/service/oauth/flickr_callback"
});
// go to Flickr authorize page
app.get('/flickr_authorize', function (req, res) {
// flickr OAuth scope is managed by management console.
var url = flickr.getAuthorizeUrl().then(function(o) {
// save oauth_token_secret to cookie temporary
var cookieDomain = '.2do.kr';
res.cookie('token_secret', o.token.oauth_token_secret, {domain: cookieDomain, path: '/'});
res.redirect(o.url);
}, function(err) {
res.send(err);
});
});
// Flickr OAuth redirection url
app.get('/service/oauth/flickr_callback', function (req, res) {
// pass oauth_token_secret from cookie
req.query.token_secret = req.cookies.token_secret;
flickr.callback(req, res).then(function(user) {
// delete temporary oauth_token_secret from cookie
var cookieDomain = '.2do.kr';
res.cookie('token_secret', '', {domain: cookieDomain, path: '/', expires: new Date(Date.now() - 1000)});
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
## Wordpress
```javascript
...
// Wordpress (REPLACE WITH YOUR OWN APP SETTINGS)
var wordpress = new soc.Wordpress({
"CLIENT_ID": "44xx2",
"CLIENT_SECRET": "axwBhV3OnQWNXzsz7ZudcDaxjDBS6TfAsb1Zho8WeifEaxxxxxxxxvq4xfEkYtFd",
"REDIRECT_URL": "http://js.2do.kr:3005/service/oauth/wordpress_callback"
});
// go to Wordpress authorize page
app.get('/wordpress_authorize', function (req, res) {
var url = wordpress.getAuthorizeUrl(); // default scope "auth"
// var url = wordpress.getAuthorizeUrl(['global']);
res.redirect(url);
});
// Wordpress OAuth redirection url
app.get('/service/oauth/wordpress_callback', function (req, res) {
// delegate to social-auth-client
wordpress.callback(req, res).then(function(user) {
// oauth token & user basic info will be shown
res.send(user);
}, function(err) {
res.send(err);
});
});
...
```
## License
* The MIT License (MIT)
* http://opensource.org/licenses/MIT
That's all folks!