@@ -13,10 +13,12 @@ var Schema = mongoose.Schema;
1313mongoose . model ( 'OAuthTokens' , new Schema ( {
1414 accessToken : { type : String } ,
1515 accessTokenExpiresOn : { type : Date } ,
16+ client : { type : Object } , // `client` and `user` are required in multiple places, for example `getAccessToken()`
1617 clientId : { type : String } ,
1718 refreshToken : { type : String } ,
1819 refreshTokenExpiresOn : { type : Date } ,
19- userId : { type : String }
20+ user : { type : Object } ,
21+ userId : { type : String } ,
2022} ) ) ;
2123
2224mongoose . model ( 'OAuthClients' , new Schema ( {
@@ -42,56 +44,67 @@ var OAuthUsersModel = mongoose.model('OAuthUsers');
4244 */
4345
4446module . exports . getAccessToken = function ( bearerToken ) {
45- console . log ( 'in getAccessToken (bearerToken: ' + bearerToken + ')' ) ;
46-
47- return OAuthTokensModel . findOne ( { accessToken : bearerToken } ) ;
47+ // Adding `.lean()`, as we get a mongoose wrapper object back from `findOne(...)`, and oauth2-server complains.
48+ return OAuthTokensModel . findOne ( { accessToken : bearerToken } ) . lean ( ) ;
4849} ;
4950
5051/**
5152 * Get client.
5253 */
5354
5455module . exports . getClient = function ( clientId , clientSecret ) {
55- console . log ( 'in getClient (clientId: ' + clientId + ', clientSecret: ' + clientSecret + ')' ) ;
56-
57- return OAuthClientsModel . findOne ( { clientId : clientId , clientSecret : clientSecret } ) ;
56+ return OAuthClientsModel . findOne ( { clientId : clientId , clientSecret : clientSecret } ) . lean ( ) ;
5857} ;
5958
6059/**
6160 * Get refresh token.
6261 */
6362
6463module . exports . getRefreshToken = function ( refreshToken ) {
65- console . log ( 'in getRefreshToken (refreshToken: ' + refreshToken + ')' ) ;
66-
67- return OAuthTokensModel . findOne ( { refreshToken : refreshToken } ) ;
64+ return OAuthTokensModel . findOne ( { refreshToken : refreshToken } ) . lean ( ) ;
6865} ;
6966
70- /*
67+ /**
7168 * Get user.
7269 */
7370
7471module . exports . getUser = function ( username , password ) {
75- console . log ( 'in getUser (username: ' + username + ', password: ' + password + ')' ) ;
76-
77- return OAuthUsersModel . findOne ( { username : username , password : password } ) ;
72+ return OAuthUsersModel . findOne ( { username : username , password : password } ) . lean ( ) ;
7873} ;
7974
8075/**
8176 * Save token.
8277 */
8378
8479module . exports . saveToken = function ( token , client , user ) {
85- console . log ( 'in saveToken (token: ' + token + ')' ) ;
86-
8780 var accessToken = new OAuthTokensModel ( {
8881 accessToken : token . accessToken ,
8982 accessTokenExpiresOn : token . accessTokenExpiresOn ,
90- clientId : client . id ,
83+ client : client ,
84+ clientId : client . clientId ,
9185 refreshToken : token . refreshToken ,
9286 refreshTokenExpiresOn : token . refreshTokenExpiresOn ,
93- userId : user . id
87+ user : user ,
88+ userId : user . _id ,
89+ } ) ;
90+ // Can't just chain `lean()` to `save()` as we did with `findOne()` elsewhere. Instead we use `Promise` to resolve the data.
91+ return new Promise ( function ( resolve , reject ) {
92+ accessToken . save ( function ( err , data ) {
93+ if ( err ) reject ( err ) ;
94+ else resolve ( data ) ;
95+ } ) ;
96+ } ) . then ( function ( saveResult ) {
97+ // `saveResult` is mongoose wrapper object, not doc itself. Calling `toJSON()` returns the doc.
98+ saveResult = saveResult && typeof saveResult == 'object' ? saveResult . toJSON ( ) : saveResult ;
99+
100+ // Unsure what else points to `saveResult` in oauth2-server, making copy to be safe
101+ var data = new Object ( ) ;
102+ for ( var prop in saveResult ) data [ prop ] = saveResult [ prop ] ;
103+
104+ // /oauth-server/lib/models/token-model.js complains if missing `client` and `user`. Creating missing properties.
105+ data . client = data . clientId ;
106+ data . user = data . userId ;
107+
108+ return data ;
94109 } ) ;
95-
96- return accessToken . save ( ) ;
97110} ;
0 commit comments