Skip to content

Commit 69af291

Browse files
authored
Merge pull request #19 from jeffreyflynt/master
Implement Refresh Token Flow
2 parents c6fbd6f + 4526117 commit 69af291

File tree

5 files changed

+37
-5
lines changed

5 files changed

+37
-5
lines changed

lib/model/meteor-model.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ export const saveAuthorizationCode = bind(function saveAuthCode (code, client, u
101101
redirectUri,
102102
scope: code.scope,
103103
client: {
104-
id: client.client_id
104+
id: client.clientId
105105
},
106106
user: {
107107
id: user.id
@@ -139,5 +139,14 @@ export const saveRefreshToken = bind(function (token, clientId, expires, user) {
139139
* @private used by OAuthMeteorModel.prototype.getRefreshToken
140140
*/
141141
export const getRefreshToken = bind(function (refreshToken) {
142-
return collections.RefreshTokens.findOne({ refreshToken })
142+
return collections.AccessTokens.findOne({ refreshToken })
143+
})
144+
145+
export const revokeToken = bind(function (token) {
146+
const docCount = collections.AccessTokens.find({ refreshToken: token.refreshToken }).count()
147+
if (docCount === 0) {
148+
return true
149+
}
150+
151+
return collections.AccessTokens.remove({ refreshToken: token.refreshToken }) === docCount
143152
})

lib/model/model.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010
saveAuthorizationCode,
1111
saveRefreshToken,
1212
saveToken,
13-
getAccessToken
13+
getAccessToken,
14+
revokeToken
1415
} from './meteor-model'
1516

1617
/**
@@ -174,6 +175,14 @@ class OAuthMeteorModel {
174175
this.log('grantTypeAllowed (clientId:', clientId, ', grantType:', grantType + ')')
175176
return ['authorization_code', 'refresh_token'].includes(grantType)
176177
}
178+
179+
/**
180+
* revokeToken(refreshToken) is required and should return true
181+
*/
182+
async revokeToken (refreshToken) {
183+
this.log(`revokeToken (refreshToken: ${refreshToken})`)
184+
return revokeToken(refreshToken)
185+
}
177186
}
178187

179188
export { OAuthMeteorModel }

lib/oauth.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { validateParams } from './validation/validateParams'
1717
import { requiredAuthorizeGetParams } from './validation/requiredAuthorizeGetParams'
1818
import { requiredAuthorizePostParams } from './validation/requiredAuthorizePostParams'
1919
import { requiredAccessTokenPostParams } from './validation/requiredAccessTokenPostParams'
20+
import { requiredRefreshTokenPostParams } from './validation/requiredRefreshTokenPostParams'
2021
import { UserValidation } from './validation/UserValidation'
2122
import { OptionsSchema } from './validation/OptionsSchema'
2223

@@ -407,7 +408,7 @@ const initRoutes = (self, { accessTokenUrl = '/oauth/token', authorizeUrl = '/oa
407408
// - validate authorization code
408409
// - issue accessToken and refreshToken
409410
route('post', accessTokenUrl, async function (req, res /*, next */) {
410-
if (!validateParams(req.body, requiredAccessTokenPostParams, self.debug)) {
411+
if (!validateParams(req.body, req.body?.refresh_token ? requiredRefreshTokenPostParams : requiredAccessTokenPostParams, self.debug)) {
411412
return errorHandler(res, {
412413
status: 400,
413414
error: 'invalid_request',

lib/utils/isModelInterface.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ const modelNames = [
1010
'saveAuthorizationCode',
1111
'saveRefreshToken',
1212
'saveToken',
13-
'getAccessToken'
13+
'getAccessToken',
14+
'revokeToken'
1415
]
1516

1617
/**
@@ -28,6 +29,7 @@ const modelNames = [
2829
* - 'saveRefreshToken',
2930
* - 'saveToken',
3031
* - 'getAccessToken'
32+
* - 'revokeToken'
3133
* @param model {Object} the model implementation
3234
* @return {boolean} true if valid, otherwise false
3335
*/
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { Match } from 'meteor/check'
2+
import { nonEmptyString } from './nonEmptyString'
3+
4+
const isNonEmptyString = Match.Where(nonEmptyString)
5+
6+
export const requiredRefreshTokenPostParams = {
7+
grant_type: isNonEmptyString,
8+
refresh_token: isNonEmptyString,
9+
client_id: Match.Maybe(String),
10+
client_secret: Match.Maybe(String)
11+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy