GoogleOauth2.0 First implementation
First try for GoogleOauth2.0
This commit is contained in:
		
							
								
								
									
										168
									
								
								express-server/node_modules/oauth/examples/express-gdata/server.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								express-server/node_modules/oauth/examples/express-gdata/server.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
			
		||||
var express = require('express'),
 | 
			
		||||
	 OAuth = require('oauth').OAuth,
 | 
			
		||||
	 querystring = require('querystring');
 | 
			
		||||
 | 
			
		||||
// Setup the Express.js server
 | 
			
		||||
var app = express.createServer();
 | 
			
		||||
app.use(express.logger());
 | 
			
		||||
app.use(express.bodyParser());
 | 
			
		||||
app.use(express.cookieParser());
 | 
			
		||||
app.use(express.session({
 | 
			
		||||
	secret: "skjghskdjfhbqigohqdiouk"
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
// Home Page
 | 
			
		||||
app.get('/', function(req, res){
 | 
			
		||||
	if(!req.session.oauth_access_token) {
 | 
			
		||||
		res.redirect("/google_login");
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		res.redirect("/google_contacts");
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Request an OAuth Request Token, and redirects the user to authorize it
 | 
			
		||||
app.get('/google_login', function(req, res) {
 | 
			
		||||
	
 | 
			
		||||
	var getRequestTokenUrl = "https://www.google.com/accounts/OAuthGetRequestToken";
 | 
			
		||||
	
 | 
			
		||||
	// GData specifid: scopes that wa want access to
 | 
			
		||||
	var gdataScopes = [
 | 
			
		||||
		querystring.escape("https://www.google.com/m8/feeds/"),
 | 
			
		||||
		querystring.escape("https://www.google.com/calendar/feeds/")
 | 
			
		||||
	];
 | 
			
		||||
	
 | 
			
		||||
	var oa = new OAuth(getRequestTokenUrl+"?scope="+gdataScopes.join('+'),
 | 
			
		||||
	                  "https://www.google.com/accounts/OAuthGetAccessToken",
 | 
			
		||||
	                  "anonymous",
 | 
			
		||||
	                  "anonymous",
 | 
			
		||||
	                  "1.0",
 | 
			
		||||
	                  "http://localhost:3000/google_cb"+( req.param('action') && req.param('action') != "" ? "?action="+querystring.escape(req.param('action')) : "" ),
 | 
			
		||||
	                  "HMAC-SHA1");
 | 
			
		||||
 | 
			
		||||
	oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){
 | 
			
		||||
	  if(error) {
 | 
			
		||||
			console.log('error');
 | 
			
		||||
	 		console.log(error);
 | 
			
		||||
		}
 | 
			
		||||
	  else { 
 | 
			
		||||
			// store the tokens in the session
 | 
			
		||||
			req.session.oa = oa;
 | 
			
		||||
			req.session.oauth_token = oauth_token;
 | 
			
		||||
			req.session.oauth_token_secret = oauth_token_secret;
 | 
			
		||||
		
 | 
			
		||||
			// redirect the user to authorize the token
 | 
			
		||||
	   	res.redirect("https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token="+oauth_token);
 | 
			
		||||
	  }
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Callback for the authorization page
 | 
			
		||||
app.get('/google_cb', function(req, res) {
 | 
			
		||||
		
 | 
			
		||||
	// get the OAuth access token with the 'oauth_verifier' that we received
 | 
			
		||||
	
 | 
			
		||||
	var oa = new OAuth(req.session.oa._requestUrl,
 | 
			
		||||
	                  req.session.oa._accessUrl,
 | 
			
		||||
	                  req.session.oa._consumerKey,
 | 
			
		||||
	                  req.session.oa._consumerSecret,
 | 
			
		||||
	                  req.session.oa._version,
 | 
			
		||||
	                  req.session.oa._authorize_callback,
 | 
			
		||||
	                  req.session.oa._signatureMethod);
 | 
			
		||||
	
 | 
			
		||||
    console.log(oa);
 | 
			
		||||
	
 | 
			
		||||
	oa.getOAuthAccessToken(
 | 
			
		||||
		req.session.oauth_token, 
 | 
			
		||||
		req.session.oauth_token_secret, 
 | 
			
		||||
		req.param('oauth_verifier'), 
 | 
			
		||||
		function(error, oauth_access_token, oauth_access_token_secret, results2) {
 | 
			
		||||
			
 | 
			
		||||
			if(error) {
 | 
			
		||||
				console.log('error');
 | 
			
		||||
				console.log(error);
 | 
			
		||||
	 		}
 | 
			
		||||
	 		else {
 | 
			
		||||
		
 | 
			
		||||
				// store the access token in the session
 | 
			
		||||
				req.session.oauth_access_token = oauth_access_token;
 | 
			
		||||
				req.session.oauth_access_token_secret = oauth_access_token_secret;
 | 
			
		||||
 | 
			
		||||
	    		res.redirect((req.param('action') && req.param('action') != "") ? req.param('action') : "/google_contacts");
 | 
			
		||||
	 		}
 | 
			
		||||
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function require_google_login(req, res, next) {
 | 
			
		||||
	if(!req.session.oauth_access_token) {
 | 
			
		||||
		res.redirect("/google_login?action="+querystring.escape(req.originalUrl));
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	next();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
app.get('/google_contacts', require_google_login, function(req, res) {
 | 
			
		||||
	var oa = new OAuth(req.session.oa._requestUrl,
 | 
			
		||||
	                  req.session.oa._accessUrl,
 | 
			
		||||
	                  req.session.oa._consumerKey,
 | 
			
		||||
	                  req.session.oa._consumerSecret,
 | 
			
		||||
	                  req.session.oa._version,
 | 
			
		||||
	                  req.session.oa._authorize_callback,
 | 
			
		||||
	                  req.session.oa._signatureMethod);
 | 
			
		||||
	
 | 
			
		||||
    console.log(oa);
 | 
			
		||||
 | 
			
		||||
	// Example using GData API v3
 | 
			
		||||
	// GData Specific Header
 | 
			
		||||
	oa._headers['GData-Version'] = '3.0'; 
 | 
			
		||||
	
 | 
			
		||||
	oa.getProtectedResource(
 | 
			
		||||
		"https://www.google.com/m8/feeds/contacts/default/full?alt=json", 
 | 
			
		||||
		"GET", 
 | 
			
		||||
		req.session.oauth_access_token, 
 | 
			
		||||
		req.session.oauth_access_token_secret,
 | 
			
		||||
		function (error, data, response) {
 | 
			
		||||
			
 | 
			
		||||
			var feed = JSON.parse(data);
 | 
			
		||||
			
 | 
			
		||||
			res.render('google_contacts.ejs', {
 | 
			
		||||
				locals: { feed: feed }
 | 
			
		||||
			});
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
app.get('/google_calendars', require_google_login, function(req, res) {
 | 
			
		||||
		var oa = new OAuth(req.session.oa._requestUrl,
 | 
			
		||||
	                  req.session.oa._accessUrl,
 | 
			
		||||
	                  req.session.oa._consumerKey,
 | 
			
		||||
	                  req.session.oa._consumerSecret,
 | 
			
		||||
	                  req.session.oa._version,
 | 
			
		||||
	                  req.session.oa._authorize_callback,
 | 
			
		||||
	                  req.session.oa._signatureMethod);
 | 
			
		||||
	// Example using GData API v2
 | 
			
		||||
	// GData Specific Header
 | 
			
		||||
	oa._headers['GData-Version'] = '2'; 
 | 
			
		||||
	
 | 
			
		||||
	oa.getProtectedResource(
 | 
			
		||||
		"https://www.google.com/calendar/feeds/default/allcalendars/full?alt=jsonc", 
 | 
			
		||||
		"GET", 
 | 
			
		||||
		req.session.oauth_access_token, 
 | 
			
		||||
		req.session.oauth_access_token_secret,
 | 
			
		||||
		function (error, data, response) {
 | 
			
		||||
			
 | 
			
		||||
			var feed = JSON.parse(data);
 | 
			
		||||
			
 | 
			
		||||
			res.render('google_calendars.ejs', {
 | 
			
		||||
				locals: { feed: feed }
 | 
			
		||||
			});
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
app.listen(3000);
 | 
			
		||||
console.log("listening on http://localhost:3000");
 | 
			
		||||
							
								
								
									
										21
									
								
								express-server/node_modules/oauth/examples/express-gdata/views/google_calendars.ejs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								express-server/node_modules/oauth/examples/express-gdata/views/google_calendars.ejs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
 | 
			
		||||
<p><a href="/google_contacts">Check google_contacts</a></p>
 | 
			
		||||
 | 
			
		||||
<h1>Google Calendars</h1>
 | 
			
		||||
 | 
			
		||||
<% for(var i = 0 ; i < feed.data.items.length ; i++ ) { 
 | 
			
		||||
  
 | 
			
		||||
  var calendar = feed.data.items[i]; %>
 | 
			
		||||
<div>
 | 
			
		||||
  
 | 
			
		||||
  <h2 style="color:white;background-color:<%= calendar["color"] %>"><%= calendar["title"] %></h2>
 | 
			
		||||
  
 | 
			
		||||
  <p>canEdit: <%= calendar["canEdit"] %></p>
 | 
			
		||||
  <p>accessLevel: <%= calendar["accessLevel"] %></p>
 | 
			
		||||
  <p>timeZone: <%= calendar["timeZone"] %></p>
 | 
			
		||||
  <p>kind: <%= calendar["kind"] %></p>
 | 
			
		||||
  <p>updated: <%= calendar["updated"] %></p>
 | 
			
		||||
  <p>created: <%= calendar["created"] %></p>
 | 
			
		||||
  
 | 
			
		||||
</div>
 | 
			
		||||
<% } %>
 | 
			
		||||
							
								
								
									
										24
									
								
								express-server/node_modules/oauth/examples/express-gdata/views/google_contacts.ejs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								express-server/node_modules/oauth/examples/express-gdata/views/google_contacts.ejs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
 | 
			
		||||
<p><a href="/google_calendars">Check google_calendars</a></p>
 | 
			
		||||
 | 
			
		||||
<h1>Google Contacts</h1>
 | 
			
		||||
 | 
			
		||||
<% for(var i = 0 ; i < feed.feed.entry.length ; i++ ) { 
 | 
			
		||||
  
 | 
			
		||||
  var contact = feed.feed.entry[i]; %>
 | 
			
		||||
 | 
			
		||||
<div>
 | 
			
		||||
  <!-- you can access much more ! Just a sample: -->
 | 
			
		||||
  <%= contact["title"]["$t"] %>
 | 
			
		||||
  <% emails = contact["gd$email"] %>
 | 
			
		||||
  
 | 
			
		||||
  <ul>
 | 
			
		||||
    <% for(var j = 0 ; j < emails.length ; j++) { %>
 | 
			
		||||
      <li><%= emails[j]["address" ]%></li>
 | 
			
		||||
    <% } %>
 | 
			
		||||
  </ul>
 | 
			
		||||
  
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<% } %>
 | 
			
		||||
							
								
								
									
										9
									
								
								express-server/node_modules/oauth/examples/express-gdata/views/layout.ejs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								express-server/node_modules/oauth/examples/express-gdata/views/layout.ejs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
  
 | 
			
		||||
<%- body %>  
 | 
			
		||||
  
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										73
									
								
								express-server/node_modules/oauth/examples/github-example.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								express-server/node_modules/oauth/examples/github-example.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
var http = require('http');
 | 
			
		||||
var qs = require('querystring');
 | 
			
		||||
// var OAuth = require('oauth'), OAuth2 = OAuth.OAuth2;
 | 
			
		||||
var OAuth2 = require('../lib/oauth2.js').OAuth2;
 | 
			
		||||
 | 
			
		||||
var clientID = '';
 | 
			
		||||
var clientSecret = '';
 | 
			
		||||
var oauth2 = new OAuth2(clientID,
 | 
			
		||||
                        clientSecret,
 | 
			
		||||
                        'https://github.com/', 
 | 
			
		||||
                        'login/oauth/authorize',
 | 
			
		||||
                        'login/oauth/access_token',
 | 
			
		||||
                        null); /** Custom headers */
 | 
			
		||||
 | 
			
		||||
http.createServer(function (req, res) {
 | 
			
		||||
    var p = req.url.split('/');
 | 
			
		||||
    pLen = p.length;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Authorised url as per github docs:
 | 
			
		||||
     * https://developer.github.com/v3/oauth/#redirect-users-to-request-github-access
 | 
			
		||||
     * 
 | 
			
		||||
     * getAuthorizedUrl: https://github.com/ciaranj/node-oauth/blob/master/lib/oauth2.js#L148
 | 
			
		||||
     * Adding params to authorize url with fields as mentioned in github docs
 | 
			
		||||
     *
 | 
			
		||||
     */
 | 
			
		||||
    var authURL = oauth2.getAuthorizeUrl({
 | 
			
		||||
        redirect_uri: 'http://localhost:8080/code',
 | 
			
		||||
        scope: ['repo', 'user'],
 | 
			
		||||
        state: 'some random string to protect against cross-site request forgery attacks'
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creating an anchor with authURL as href and sending as response
 | 
			
		||||
     */
 | 
			
		||||
    var body = '<a href="' + authURL + '"> Get Code </a>';
 | 
			
		||||
    if (pLen === 2 && p[1] === '') {
 | 
			
		||||
        res.writeHead(200, {
 | 
			
		||||
            'Content-Length': body.length,
 | 
			
		||||
            'Content-Type': 'text/html' });
 | 
			
		||||
        res.end(body);
 | 
			
		||||
    } else if (pLen === 2 && p[1].indexOf('code') === 0) {
 | 
			
		||||
 | 
			
		||||
        /** Github sends auth code so that access_token can be obtained */
 | 
			
		||||
        var qsObj = {};
 | 
			
		||||
        
 | 
			
		||||
        /** To obtain and parse code='...' from code?code='...' */
 | 
			
		||||
        qsObj = qs.parse(p[1].split('?')[1]); 
 | 
			
		||||
 | 
			
		||||
        /** Obtaining access_token */
 | 
			
		||||
        oauth2.getOAuthAccessToken(
 | 
			
		||||
            qsObj.code,
 | 
			
		||||
            {'redirect_uri': 'http://localhost:8080/code/'},
 | 
			
		||||
            function (e, access_token, refresh_token, results){
 | 
			
		||||
                if (e) {
 | 
			
		||||
                    console.log(e);
 | 
			
		||||
                    res.end(e);
 | 
			
		||||
                } else if (results.error) {
 | 
			
		||||
                    console.log(results);
 | 
			
		||||
                    res.end(JSON.stringify(results));
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    console.log('Obtained access_token: ', access_token);
 | 
			
		||||
                    res.end( access_token);
 | 
			
		||||
                }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    } else {
 | 
			
		||||
        // Unhandled url
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}).listen(8080);
 | 
			
		||||
							
								
								
									
										31
									
								
								express-server/node_modules/oauth/examples/term.ie.oauth-HMAC-SHA1.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								express-server/node_modules/oauth/examples/term.ie.oauth-HMAC-SHA1.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
var util= require('util')
 | 
			
		||||
 | 
			
		||||
var OAuth= require('../lib/oauth').OAuth;
 | 
			
		||||
 | 
			
		||||
var oa= new OAuth("http://term.ie/oauth/example/request_token.php",
 | 
			
		||||
                  "http://term.ie/oauth/example/access_token.php",
 | 
			
		||||
                  "key",
 | 
			
		||||
                  "secret",
 | 
			
		||||
                  "1.0",
 | 
			
		||||
                  null,
 | 
			
		||||
                  "HMAC-SHA1")
 | 
			
		||||
 | 
			
		||||
oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){
 | 
			
		||||
  if(error) util.puts('error :' + error)
 | 
			
		||||
  else { 
 | 
			
		||||
    util.puts('oauth_token :' + oauth_token)
 | 
			
		||||
    util.puts('oauth_token_secret :' + oauth_token_secret)
 | 
			
		||||
    util.puts('requestoken results :' + util.inspect(results))
 | 
			
		||||
    util.puts("Requesting access token")
 | 
			
		||||
    oa.getOAuthAccessToken(oauth_token, oauth_token_secret, function(error, oauth_access_token, oauth_access_token_secret, results2) {
 | 
			
		||||
      util.puts('oauth_access_token :' + oauth_access_token)
 | 
			
		||||
      util.puts('oauth_token_secret :' + oauth_access_token_secret)
 | 
			
		||||
      util.puts('accesstoken results :' + util.inspect(results2))
 | 
			
		||||
      util.puts("Requesting access token")
 | 
			
		||||
      var data= "";
 | 
			
		||||
      oa.getProtectedResource("http://term.ie/oauth/example/echo_api.php?foo=bar&too=roo", "GET", oauth_access_token, oauth_access_token_secret,  function (error, data, response) {
 | 
			
		||||
          util.puts(data);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										75
									
								
								express-server/node_modules/oauth/examples/twitter-example.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								express-server/node_modules/oauth/examples/twitter-example.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
			
		||||
var http = require('http');
 | 
			
		||||
var OAuth = require('../lib/oauth.js').OAuth;
 | 
			
		||||
var nodeUrl = require('url');
 | 
			
		||||
var clientID = '';
 | 
			
		||||
var clientSecret = '';
 | 
			
		||||
var callbackURL = '';
 | 
			
		||||
 | 
			
		||||
oa = new OAuth(
 | 
			
		||||
    'https://api.twitter.com/oauth/request_token',
 | 
			
		||||
    'https://api.twitter.com/oauth/access_token',
 | 
			
		||||
    clientID,
 | 
			
		||||
    clientSecret,
 | 
			
		||||
    '1.0',
 | 
			
		||||
    callbackURL,
 | 
			
		||||
    'HMAC-SHA1'
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
http.createServer(function (request, response) {
 | 
			
		||||
    oa.getOAuthRequestToken(function (error, oAuthToken, oAuthTokenSecret, results) {
 | 
			
		||||
        var urlObj = nodeUrl.parse(request.url, true);
 | 
			
		||||
        var authURL = 'https://twitter.com/' +
 | 
			
		||||
                'oauth/authenticate?oauth_token=' + oAuthToken;
 | 
			
		||||
        var handlers = {
 | 
			
		||||
            '/': function (request, response) {
 | 
			
		||||
                /**
 | 
			
		||||
                 * Creating an anchor with authURL as href and sending as response
 | 
			
		||||
                 */
 | 
			
		||||
                var body = '<a href="' + authURL + '"> Get Code </a>';
 | 
			
		||||
                response.writeHead(200, {
 | 
			
		||||
                    'Content-Length': body.length,
 | 
			
		||||
                    'Content-Type': 'text/html' });
 | 
			
		||||
                response.end(body);
 | 
			
		||||
            },
 | 
			
		||||
            '/callback': function (request, response) {
 | 
			
		||||
                /** Obtaining access_token */
 | 
			
		||||
                var getOAuthRequestTokenCallback = function (error, oAuthAccessToken,
 | 
			
		||||
                                                             oAuthAccessTokenSecret, results) {
 | 
			
		||||
                    if (error) {
 | 
			
		||||
                        console.log(error);
 | 
			
		||||
                        response.end(JSON.stringify({
 | 
			
		||||
                            message: 'Error occured while getting access token',
 | 
			
		||||
                            error: error
 | 
			
		||||
                        }));
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    oa.get('https://api.twitter.com/1.1/account/verify_credentials.json',
 | 
			
		||||
                           oAuthAccessToken,
 | 
			
		||||
                           oAuthAccessTokenSecret,
 | 
			
		||||
                           function (error, twitterResponseData, result) {
 | 
			
		||||
                               if (error) {
 | 
			
		||||
                                   console.log(error)
 | 
			
		||||
                                   res.end(JSON.stringify(error));
 | 
			
		||||
                                   return;
 | 
			
		||||
                               }
 | 
			
		||||
                               try {
 | 
			
		||||
                                   console.log(JSON.parse(twitterResponseData));
 | 
			
		||||
                               } catch (parseError) {
 | 
			
		||||
                                   console.log(parseError);
 | 
			
		||||
                               }
 | 
			
		||||
                               console.log(twitterResponseData);
 | 
			
		||||
                               response.end(twitterResponseData);
 | 
			
		||||
                           });
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                oa.getOAuthAccessToken(urlObj.query.oauth_token, oAuthTokenSecret,
 | 
			
		||||
                                       urlObj.query.oauth_verifier,
 | 
			
		||||
                                       getOAuthRequestTokenCallback);
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        handlers[urlObj.pathname](request, response);
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
}).listen(3000);
 | 
			
		||||
		Reference in New Issue
	
	Block a user