Skip to content

Commit f2b1ee2

Browse files
author
Manjesh Vinayaka
committed
Added mongo model
1 parent 82456bf commit f2b1ee2

22 files changed

+899
-24
lines changed

app.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ app.use(cookieParser());
2424
app.use(express.static(path.join(__dirname, 'public')));
2525

2626
if (config.seedDB) { require('./components/oauth/seed'); }
27+
if (config.seedMongoDB) { require('./components/oauth/seed-mongo'); }
2728

2829
/** Public Area **/
2930

components/oauth/authenticate.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ var oauthServer = require('oauth2-server');
66
var Request = oauthServer.Request;
77
var Response = oauthServer.Response;
88
var db = require('./sqldb')
9-
10-
var oauth = new oauthServer({
11-
model: require('./models.js')
12-
});
9+
var config = require('../../config');
10+
if(config.db === 'mongo'){
11+
db = require('./mongodb')
12+
}
13+
var oauth = require('./oauth')
1314

1415
module.exports = function(options){
1516
var options = options || {};
@@ -27,6 +28,18 @@ module.exports = function(options){
2728
// Request is authorized.
2829
// Todo: Temporary for req.user or req.session
2930
var bearer = req.headers.authorization.replace('Bearer','').replace('bearer','').trim()
31+
if(config.db==='mongo'){
32+
return db.OAuthAccessToken.findOne({ access_token: bearer})
33+
.populate('User')
34+
.then(function(aT){
35+
req.user = aT ? aT.User : {};
36+
next()
37+
}).catch(function(err){
38+
console.log("Error while getting session",err)
39+
req.user = null
40+
next()
41+
})
42+
}
3043
return db.OAuthAccessToken.findOne({
3144
include: [{
3245
model:db.User,

components/oauth/express.js

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@
55
var oauthServer = require('oauth2-server');
66
var Request = oauthServer.Request;
77
var Response = oauthServer.Response;
8+
var config = require('../../config')
89

9-
var oauth = new oauthServer({
10-
model: require('./models.js')
11-
});
10+
var oauth = require('./oauth')
1211

1312
module.exports = function(app){
14-
15-
1613
app.all('/oauth/token', function(req,res,next){
1714
var request = new Request(req);
1815
var response = new Response(res);
@@ -23,10 +20,23 @@ module.exports = function(app){
2320
// Todo: remove unnecessary values in response
2421
return res.json(token)
2522
}).catch(function(err){
26-
return res.status( 500).json(err)
23+
return res.status(500).json(err)
2724
})
2825
});
2926

27+
app.post('/authorise', function(req, res){
28+
var request = new Request(req);
29+
var response = new Response(res);
30+
31+
return oauth.authorize(request, response).then(function(success) {
32+
// if (req.body.allow !== 'true') return callback(null, false);
33+
// return callback(null, true, req.user);
34+
res.json(success)
35+
}).catch(function(err){
36+
res.status(err.code || 500).json(err)
37+
})
38+
});
39+
3040
app.get('/authorise', function(req, res) {
3141
return db.OAuthClient.findOne({
3242
where: {
@@ -42,17 +52,4 @@ module.exports = function(app){
4252
return res.status(err.code || 500).json(err)
4353
});
4454
});
45-
46-
app.post('/authorise', function(req, res){
47-
var request = new Request(req);
48-
var response = new Response(res);
49-
50-
return oauth.authorize(request, response).then(function(success) {
51-
// if (req.body.allow !== 'true') return callback(null, false);
52-
// return callback(null, true, req.user);
53-
res.json(success)
54-
}).catch(function(err){
55-
res.status(err.code || 500).json(err)
56-
})
57-
});
5855
}

components/oauth/mongo-models.js

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
/**
2+
* Created by Manjesh on 14-05-2016.
3+
*/
4+
5+
var _ = require('lodash');
6+
var mongodb = require('./mongodb');
7+
var User = mongodb.User;
8+
var OAuthClient = mongodb.OAuthClient;
9+
var OAuthAccessToken = mongodb.OAuthAccessToken;
10+
var OAuthAuthorizationCode = mongodb.OAuthAuthorizationCode;
11+
var OAuthRefreshToken = mongodb.OAuthRefreshToken;
12+
13+
function getAccessToken(bearerToken) {
14+
console.log("getAccessToken",bearerToken)
15+
return OAuthAccessToken
16+
//User,OAuthClient
17+
.findOne({access_token: bearerToken})
18+
.populate('User')
19+
.populate('OAuthClient')
20+
.then(function (accessToken) {
21+
console.log('at',accessToken)
22+
if (!accessToken) return false;
23+
var token = accessToken;
24+
token.user = token.User;
25+
token.client = token.OAuthClient;
26+
token.scope = token.scope
27+
return token;
28+
})
29+
.catch(function (err) {
30+
console.log("getAccessToken - Err: ")
31+
});
32+
}
33+
34+
function getClient(clientId, clientSecret) {
35+
console.log("getClient",clientId, clientSecret)
36+
const options = {client_id: clientId};
37+
if (clientSecret) options.client_secret = clientSecret;
38+
39+
return OAuthClient
40+
.findOne(options)
41+
.then(function (client) {
42+
if (!client) return new Error("client not found");
43+
var clientWithGrants = client
44+
clientWithGrants.grants = ['authorization_code', 'password', 'refresh_token', 'client_credentials']
45+
// Todo: need to create another table for redirect URIs
46+
clientWithGrants.redirectUris = [clientWithGrants.redirect_uri]
47+
delete clientWithGrants.redirect_uri
48+
//clientWithGrants.refreshTokenLifetime = integer optional
49+
//clientWithGrants.accessTokenLifetime = integer optional
50+
return clientWithGrants
51+
}).catch(function (err) {
52+
console.log("getClient - Err: ", err)
53+
});
54+
}
55+
56+
57+
function getUser(username, password) {
58+
return User
59+
.findOne({username: username})
60+
.then(function (user) {
61+
console.log("u",user)
62+
return user.password == password ? user : false;
63+
})
64+
.catch(function (err) {
65+
console.log("getUser - Err: ", err)
66+
});
67+
}
68+
69+
function revokeAuthorizationCode(code) {
70+
console.log("revokeAuthorizationCode",code)
71+
return OAuthAuthorizationCode.findOne({
72+
where: {
73+
authorization_code: code.code
74+
}
75+
}).then(function (rCode) {
76+
//if(rCode) rCode.destroy();
77+
/***
78+
* As per the discussion we need set older date
79+
* revokeToken will expected return a boolean in future version
80+
* https://github.com/oauthjs/node-oauth2-server/pull/274
81+
* https://github.com/oauthjs/node-oauth2-server/issues/290
82+
*/
83+
var expiredCode = code
84+
expiredCode.expiresAt = new Date('2015-05-28T06:59:53.000Z')
85+
return expiredCode
86+
}).catch(function (err) {
87+
console.log("getUser - Err: ", err)
88+
});
89+
}
90+
91+
function revokeToken(token) {
92+
console.log("revokeToken",token)
93+
return OAuthRefreshToken.findOne({
94+
where: {
95+
refresh_token: token.refreshToken
96+
}
97+
}).then(function (rT) {
98+
if (rT) rT.destroy();
99+
/***
100+
* As per the discussion we need set older date
101+
* revokeToken will expected return a boolean in future version
102+
* https://github.com/oauthjs/node-oauth2-server/pull/274
103+
* https://github.com/oauthjs/node-oauth2-server/issues/290
104+
*/
105+
var expiredToken = token
106+
expiredToken.refreshTokenExpiresAt = new Date('2015-05-28T06:59:53.000Z')
107+
return expiredToken
108+
}).catch(function (err) {
109+
console.log("revokeToken - Err: ", err)
110+
});
111+
}
112+
113+
114+
function saveToken(token, client, user) {
115+
console.log("saveToken",token, client, user)
116+
return Promise.all([
117+
OAuthAccessToken.create({
118+
access_token: token.accessToken,
119+
expires: token.accessTokenExpiresAt,
120+
OAuthClient: client._id,
121+
User: user._id,
122+
scope: token.scope
123+
}),
124+
token.refreshToken ? OAuthRefreshToken.create({ // no refresh token for client_credentials
125+
refresh_token: token.refreshToken,
126+
expires: token.refreshTokenExpiresAt,
127+
OAuthClient: client._id,
128+
User: user._id,
129+
scope: token.scope
130+
}) : [],
131+
132+
])
133+
.then(function (resultsArray) {
134+
return _.assign( // expected to return client and user, but not returning
135+
{
136+
client: client,
137+
user: user,
138+
access_token: token.accessToken, // proxy
139+
refresh_token: token.refreshToken, // proxy
140+
},
141+
token
142+
)
143+
})
144+
.catch(function (err) {
145+
console.log("revokeToken - Err: ", err)
146+
});
147+
}
148+
149+
function getAuthorizationCode(code) {
150+
console.log("getAuthorizationCode",code)
151+
return OAuthAuthorizationCode
152+
.findOne({authorization_code: code})
153+
.populate('User')
154+
.populate('OAuthClient')
155+
.then(function (authCodeModel) {
156+
if (!authCodeModel) return false;
157+
var client = authCodeModel.OAuthClient
158+
var user = authCodeModel.User
159+
return reCode = {
160+
code: code,
161+
client: client,
162+
expiresAt: authCodeModel.expires,
163+
redirectUri: client.redirect_uri,
164+
user: user,
165+
scope: authCodeModel.scope,
166+
};
167+
}).catch(function (err) {
168+
console.log("getAuthorizationCode - Err: ", err)
169+
});
170+
}
171+
172+
function saveAuthorizationCode(code, client, user) {
173+
console.log("saveAuthorizationCode",code, client, user)
174+
return OAuthAuthorizationCode
175+
.create({
176+
expires: code.expiresAt,
177+
OAuthClient: client._id,
178+
authorization_code: code.authorizationCode,
179+
User: user._id,
180+
scope: code.scope
181+
})
182+
.then(function () {
183+
code.code = code.authorizationCode
184+
return code
185+
}).catch(function (err) {
186+
console.log("saveAuthorizationCode - Err: ", err)
187+
});
188+
}
189+
190+
function getUserFromClient(client) {
191+
console.log("getUserFromClient", client)
192+
var options = {client_id: client.client_id};
193+
if (client.client_secret) options.client_secret = client.client_secret;
194+
195+
return OAuthClient
196+
.findOne(options)
197+
.populate('User')
198+
.then(function (client) {
199+
console.log(client)
200+
if (!client) return false;
201+
if (!client.User) return false;
202+
return client.User;
203+
}).catch(function (err) {
204+
console.log("getUserFromClient - Err: ", err)
205+
});
206+
}
207+
208+
function getRefreshToken(refreshToken) {
209+
console.log("getRefreshToken", refreshToken)
210+
if (!refreshToken || refreshToken === 'undefined') return false
211+
//[OAuthClient, User]
212+
return OAuthRefreshToken
213+
.findOne({refresh_token: refreshToken})
214+
.populate('User')
215+
.populate('OAuthClient')
216+
.then(function (savedRT) {
217+
console.log("srt",savedRT)
218+
var tokenTemp = {
219+
user: savedRT ? savedRT.User : {},
220+
client: savedRT ? savedRT.OAuthClient : {},
221+
refreshTokenExpiresAt: savedRT ? new Date(savedRT.expires) : null,
222+
refreshToken: refreshToken,
223+
refresh_token: refreshToken,
224+
scope: savedRT.scope
225+
};
226+
return tokenTemp;
227+
228+
}).catch(function (err) {
229+
console.log("getRefreshToken - Err: ", err)
230+
});
231+
}
232+
233+
function validateScope(token, scope) {
234+
console.log("validateScope", token, scope)
235+
return token.scope === scope
236+
}
237+
238+
module.exports = {
239+
//generateOAuthAccessToken, optional - used for jwt
240+
//generateAuthorizationCode, optional
241+
//generateOAuthRefreshToken, - optional
242+
getAccessToken: getAccessToken,
243+
getAuthorizationCode: getAuthorizationCode, //getOAuthAuthorizationCode renamed to,
244+
getClient: getClient,
245+
getRefreshToken: getRefreshToken,
246+
getUser: getUser,
247+
getUserFromClient: getUserFromClient,
248+
//grantTypeAllowed, Removed in oauth2-server 3.0
249+
revokeAuthorizationCode: revokeAuthorizationCode,
250+
revokeToken: revokeToken,
251+
saveToken: saveToken,//saveOAuthAccessToken, renamed to
252+
saveAuthorizationCode: saveAuthorizationCode, //renamed saveOAuthAuthorizationCode,
253+
validateScope: validateScope,
254+
}
255+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Created by Manjesh on 14-05-2016.
3+
*/
4+
5+
'use strict';
6+
7+
var mongoose = require('mongoose'),
8+
Schema = mongoose.Schema;
9+
10+
var OAuthAccessTokenSchema = new Schema({
11+
access_token: String,
12+
expires: Date,
13+
scope: String,
14+
User: { type : Schema.Types.ObjectId, ref: 'User' },
15+
OAuthClient: { type : Schema.Types.ObjectId, ref: 'OAuthClient' },
16+
});
17+
18+
module.exports = mongoose.model('OAuthAccessToken', OAuthAccessTokenSchema);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Created by Manjesh on 14-05-2016.
3+
*/
4+
5+
'use strict';
6+
7+
var mongoose = require('mongoose'),
8+
Schema = mongoose.Schema;
9+
10+
var OAuthAuthorizationCodeSchema = new Schema({
11+
authorization_code: String,
12+
expires: Date,
13+
redirect_uri: String,
14+
scope: String,
15+
User: { type : Schema.Types.ObjectId, ref: 'User' },
16+
OAuthClient: { type : Schema.Types.ObjectId, ref: 'OAuthClient' },
17+
});
18+
19+
module.exports = mongoose.model('OAuthAuthorizationCode', OAuthAuthorizationCodeSchema);
20+

0 commit comments

Comments
 (0)