Skip to content

Commit 13e052e

Browse files
fix(component): make client password and bearer strategy as mandatory (#210)
make client password strategy mandatory as it needs to be for any authentication by any strategy. Also, make bearer stratgey mandatory as everybody use it GH-209
1 parent f757e57 commit 13e052e

File tree

22 files changed

+365
-309
lines changed

22 files changed

+365
-309
lines changed

docs/README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ Once this is done, you are ready to configure any of the available strategy in t
8787

8888
### Oauth2-client-password
8989

90-
In order to use it, run `npm install passport-oauth2-client-password`.
9190
First, create an AuthClient model implementing the IAuthClient interface. The purpose of this model is to store oauth registered clients for the app in the DB. See sample below.
9291

9392
```ts
@@ -250,7 +249,6 @@ For accessing the authenticated AuthClient model reference, you can inject the C
250249

251250
### Http-bearer
252251

253-
In order to use it, run `npm install passport-http-bearer`.
254252
First, create a AuthUser model implementing the IAuthUser interface. You can implement the interface in the user model itself. See sample below.
255253

256254
```ts

package.json

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,6 @@
2020
"type": "./dist/strategies/passport/passport-azure-ad/index.d.ts",
2121
"default": "./dist/strategies/passport/passport-azure-ad/index.js"
2222
},
23-
"./passport-bearer": {
24-
"type": "./dist/strategies/passport/passport-bearer/index.d.ts",
25-
"default": "./dist/strategies/passport/passport-bearer/index.js"
26-
},
27-
"./passport-client-password": {
28-
"type": "./dist/strategies/passport/passport-client-password/index.d.ts",
29-
"default": "./dist/strategies/passport/passport-client-password/index.js"
30-
},
3123
"./passport-cognito-oauth2": {
3224
"type": "./dist/strategies/passport/passport-cognito-oauth2/index.d.ts",
3325
"default": "./dist/strategies/passport/passport-cognito-oauth2/index.js"
@@ -157,6 +149,8 @@
157149
"https-proxy-agent": "^5.0.0",
158150
"jsonwebtoken": "^9.0.0",
159151
"passport": "^0.6.0",
152+
"passport-http-bearer": "^1.0.1",
153+
"passport-oauth2-client-password": "^0.1.2",
160154
"tslib": "^2.0.0"
161155
},
162156
"devDependencies": {
@@ -208,11 +202,9 @@
208202
"passport-cognito-oauth2": "^0.1.1",
209203
"passport-facebook": "^3.0.0",
210204
"passport-google-oauth20": "^2.0.0",
211-
"passport-http-bearer": "^1.0.1",
212205
"passport-instagram": "^1.0.0",
213206
"passport-local": "^1.0.0",
214207
"passport-oauth2": "^1.6.1",
215-
"passport-oauth2-client-password": "^0.1.2",
216208
"@exlinc/keycloak-passport": "^1.0.2"
217209
},
218210
"publishConfig": {

src/__tests__/integration/action-sequence/passport-apple-oauth2/apple-oauth2.integration.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
import {Client, createClientForHandler} from '@loopback/testlab';
2-
import {RestServer, Request} from '@loopback/rest';
3-
import {Application, Constructor, Provider} from '@loopback/core';
1+
import {Application, Provider} from '@loopback/core';
42
import {get} from '@loopback/openapi-v3';
3+
import {Request, RestServer} from '@loopback/rest';
4+
import {Client, createClientForHandler} from '@loopback/testlab';
5+
import AppleStrategy, {DecodedIdToken} from 'passport-apple';
56
import {authenticate} from '../../../../decorators';
6-
import {STRATEGY} from '../../../../strategy-name.enum';
7-
import {getApp} from '../helpers/helpers';
8-
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
9-
import {Strategies} from '../../../../strategies/keys';
107
import {VerifyFunction} from '../../../../strategies';
11-
import {userWithoutReqObj} from '../../../fixtures/data/bearer-data';
12-
import AppleStrategy, {DecodedIdToken} from 'passport-apple';
8+
import {Strategies} from '../../../../strategies/keys';
139
import {AppleAuthStrategyFactoryProvider} from '../../../../strategies/passport/passport-apple-oauth2';
14-
import {ClientPasswordVerifyProvider} from '../../../fixtures/providers/passport-client.provider';
15-
import {ClientPasswordStrategyFactoryProvider} from '../../../../strategies/passport/passport-client-password';
10+
import {STRATEGY} from '../../../../strategy-name.enum';
11+
import {userWithoutReqObj} from '../../../fixtures/data/bearer-data';
12+
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
13+
import {getApp} from '../helpers/helpers';
1614

1715
describe('getting apple oauth2 strategy with options', () => {
1816
let app: Application;
@@ -51,12 +49,6 @@ describe('getting apple oauth2 strategy with options', () => {
5149
}
5250

5351
function getAuthVerifier() {
54-
app
55-
.bind(Strategies.Passport.OAUTH2_CLIENT_PASSWORD_VERIFIER)
56-
.toProvider(ClientPasswordVerifyProvider);
57-
app
58-
.bind(Strategies.Passport.CLIENT_PASSWORD_STRATEGY_FACTORY)
59-
.toProvider(ClientPasswordStrategyFactoryProvider);
6052
app
6153
.bind(Strategies.Passport.APPLE_OAUTH2_STRATEGY_FACTORY)
6254
.toProvider(AppleAuthStrategyFactoryProvider);

src/__tests__/integration/action-sequence/passport-bearer/bearer-token-verify.integration.ts

Lines changed: 54 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1-
import {IAuthUser} from '../../../../types';
2-
import {expect, Client, createClientForHandler} from '@loopback/testlab';
3-
import {RestServer} from '@loopback/rest';
41
import {Application, inject} from '@loopback/core';
52
import {get} from '@loopback/openapi-v3';
3+
import {RestServer} from '@loopback/rest';
4+
import {Client, createClientForHandler, expect} from '@loopback/testlab';
65
import {authenticate} from '../../../../decorators';
7-
import {STRATEGY} from '../../../../strategy-name.enum';
8-
import {getApp} from '../helpers/helpers';
9-
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
10-
import {Strategies} from '../../../../strategies/keys';
116
import {AuthenticationBindings} from '../../../../keys';
7+
import {Strategies} from '../../../../strategies/keys';
8+
import {STRATEGY} from '../../../../strategy-name.enum';
9+
import {IAuthUser} from '../../../../types';
1210
import {BearerTokenVerifyProvider} from '../../../fixtures/providers/bearer-passport.provider';
13-
import {BearerStrategyFactoryProvider} from '../../../../strategies/passport/passport-bearer';
14-
import {ClientPasswordVerifyProvider} from '../../../fixtures/providers/passport-client.provider';
15-
import {ClientPasswordStrategyFactoryProvider} from '../../../../strategies/passport/passport-client-password';
11+
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
12+
import {getApp} from '../helpers/helpers';
1613

1714
/**
1815
* Testing overall flow of authentication with bearer strategy
@@ -242,15 +239,53 @@ describe('Bearer-token strategy', () => {
242239
app
243240
.bind(Strategies.Passport.BEARER_TOKEN_VERIFIER)
244241
.toProvider(BearerTokenVerifyProvider);
245-
app
246-
.bind(Strategies.Passport.BEARER_STRATEGY_FACTORY)
247-
.toProvider(BearerStrategyFactoryProvider);
248-
app
249-
.bind(Strategies.Passport.OAUTH2_CLIENT_PASSWORD_VERIFIER)
250-
.toProvider(ClientPasswordVerifyProvider);
251-
app
252-
.bind(Strategies.Passport.CLIENT_PASSWORD_STRATEGY_FACTORY)
253-
.toProvider(ClientPasswordStrategyFactoryProvider);
242+
}
243+
244+
function givenAuthenticatedSequence() {
245+
// bind user defined sequence
246+
server.sequence(MyAuthenticationSequence);
247+
}
248+
});
249+
250+
describe('integration test when no provider was implemented', () => {
251+
let app: Application;
252+
let server: RestServer;
253+
beforeEach(givenAServer);
254+
beforeEach(givenAuthenticatedSequence);
255+
256+
it('should return error as the verifier is not implemented', async () => {
257+
class BearerNoVerifierController {
258+
constructor(
259+
@inject(AuthenticationBindings.CURRENT_USER) // tslint:disable-next-line: no-shadowed-variable
260+
private readonly user: IAuthUser | undefined,
261+
) {}
262+
263+
options = {
264+
passRequestToCallback: false,
265+
};
266+
267+
@get('/auth/bearer/no-verifier')
268+
@authenticate(STRATEGY.BEARER, {passReqToCallback: false})
269+
async test() {
270+
return this.user;
271+
}
272+
}
273+
274+
app.controller(BearerNoVerifierController);
275+
276+
await whenIMakeRequestTo(server)
277+
.get('/auth/bearer/no-verifier')
278+
.set('Authorization', 'Bearer sometoken')
279+
.expect(401);
280+
});
281+
282+
function whenIMakeRequestTo(restServer: RestServer): Client {
283+
return createClientForHandler(restServer.requestHandler);
284+
}
285+
286+
async function givenAServer() {
287+
app = getApp();
288+
server = await app.getServer(RestServer);
254289
}
255290

256291
function givenAuthenticatedSequence() {

src/__tests__/integration/action-sequence/passport-client-password/client-password-verify.integration.ts

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
/* eslint-disable @typescript-eslint/naming-convention */
22

3-
import {IAuthClient} from '../../../../types';
4-
import {Client, createClientForHandler, expect} from '@loopback/testlab';
5-
import {RestServer} from '@loopback/rest';
63
import {Application, inject} from '@loopback/core';
74
import {post, requestBody} from '@loopback/openapi-v3';
5+
import {RestServer} from '@loopback/rest';
6+
import {Client, createClientForHandler, expect} from '@loopback/testlab';
87
import {authenticateClient} from '../../../../decorators';
9-
import {STRATEGY} from '../../../../strategy-name.enum';
10-
import {getApp} from '../helpers/helpers';
11-
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
12-
import {Strategies} from '../../../../strategies/keys';
138
import {AuthenticationBindings} from '../../../../keys';
9+
import {Strategies} from '../../../../strategies/keys';
10+
import {STRATEGY} from '../../../../strategy-name.enum';
11+
import {IAuthClient} from '../../../../types';
1412
import {ClientPasswordVerifyProvider} from '../../../fixtures/providers/passport-client.provider';
15-
import {ClientPasswordStrategyFactoryProvider} from '../../../../strategies/passport/passport-client-password';
13+
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
14+
import {getApp} from '../helpers/helpers';
1615

1716
describe('Client-password strategy', () => {
1817
let app: Application;
@@ -144,9 +143,55 @@ describe('Client-password strategy', () => {
144143
app
145144
.bind(Strategies.Passport.OAUTH2_CLIENT_PASSWORD_VERIFIER)
146145
.toProvider(ClientPasswordVerifyProvider);
147-
app
148-
.bind(Strategies.Passport.CLIENT_PASSWORD_STRATEGY_FACTORY)
149-
.toProvider(ClientPasswordStrategyFactoryProvider);
146+
}
147+
148+
function givenAuthenticatedSequence() {
149+
// bind user defined sequence
150+
server.sequence(MyAuthenticationSequence);
151+
}
152+
});
153+
154+
describe('integration test for client-password and no verifier', () => {
155+
let app: Application;
156+
let server: RestServer;
157+
beforeEach(givenAServer);
158+
beforeEach(givenAuthenticatedSequence);
159+
160+
it('should return status 401 as this strategy is not implemented', async () => {
161+
class TestController {
162+
constructor(
163+
@inject(AuthenticationBindings.CURRENT_CLIENT) // tslint:disable-next-line: no-shadowed-variable
164+
private readonly client: IAuthClient | undefined,
165+
) {}
166+
167+
@post('/test')
168+
@authenticateClient(STRATEGY.CLIENT_PASSWORD, {passReqToCallback: true})
169+
test(
170+
@requestBody()
171+
body: {
172+
client_id: string;
173+
client_secret: string;
174+
},
175+
) {
176+
return this.client;
177+
}
178+
}
179+
180+
app.controller(TestController);
181+
182+
await whenIMakeRequestTo(server)
183+
.post('/test')
184+
.send({client_id: 'some id', client_secret: 'some secret'})
185+
.expect(401);
186+
});
187+
188+
function whenIMakeRequestTo(restServer: RestServer): Client {
189+
return createClientForHandler(restServer.requestHandler);
190+
}
191+
192+
async function givenAServer() {
193+
app = getApp();
194+
server = await app.getServer(RestServer);
150195
}
151196

152197
function givenAuthenticatedSequence() {

src/__tests__/integration/action-sequence/passport-cognito-oauth2/cognito-oauth2.integration.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
import {Client, createClientForHandler} from '@loopback/testlab';
2-
import {RestServer, Request} from '@loopback/rest';
3-
import {Application, Constructor, Provider} from '@loopback/core';
1+
import {Application, Provider} from '@loopback/core';
42
import {get} from '@loopback/openapi-v3';
3+
import {Request, RestServer} from '@loopback/rest';
4+
import {Client, createClientForHandler} from '@loopback/testlab';
55
import {authenticate} from '../../../../decorators';
6-
import {STRATEGY} from '../../../../strategy-name.enum';
7-
import {getApp} from '../helpers/helpers';
8-
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
9-
import {Strategies} from '../../../../strategies/keys';
106
import {VerifyFunction} from '../../../../strategies';
11-
import {userWithoutReqObj} from '../../../fixtures/data/bearer-data';
12-
import {Cognito} from '../../../../types';
7+
import {Strategies} from '../../../../strategies/keys';
138
import {CognitoStrategyFactoryProvider} from '../../../../strategies/passport/passport-cognito-oauth2';
14-
import {ClientPasswordVerifyProvider} from '../../../fixtures/providers/passport-client.provider';
15-
import {ClientPasswordStrategyFactoryProvider} from '../../../../strategies/passport/passport-client-password';
9+
import {STRATEGY} from '../../../../strategy-name.enum';
10+
import {Cognito} from '../../../../types';
11+
import {userWithoutReqObj} from '../../../fixtures/data/bearer-data';
12+
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
13+
import {getApp} from '../helpers/helpers';
1614

1715
describe('getting cognito oauth2 strategy with options', () => {
1816
let app: Application;
@@ -49,12 +47,6 @@ describe('getting cognito oauth2 strategy with options', () => {
4947
}
5048

5149
function getAuthVerifier() {
52-
app
53-
.bind(Strategies.Passport.OAUTH2_CLIENT_PASSWORD_VERIFIER)
54-
.toProvider(ClientPasswordVerifyProvider);
55-
app
56-
.bind(Strategies.Passport.CLIENT_PASSWORD_STRATEGY_FACTORY)
57-
.toProvider(ClientPasswordStrategyFactoryProvider);
5850
app
5951
.bind(Strategies.Passport.COGNITO_OAUTH2_VERIFIER)
6052
.toProvider(CognitoAuthVerifyProvider);

src/__tests__/integration/action-sequence/passport-google-oauth2/google-oauth2.integration.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
import {Client, createClientForHandler} from '@loopback/testlab';
2-
import {RestServer, Request} from '@loopback/rest';
3-
import {Application, Constructor, Provider} from '@loopback/core';
1+
import {Application, Provider} from '@loopback/core';
42
import {get} from '@loopback/openapi-v3';
3+
import {Request, RestServer} from '@loopback/rest';
4+
import {Client, createClientForHandler} from '@loopback/testlab';
5+
import * as GoogleStrategy from 'passport-google-oauth20';
56
import {authenticate} from '../../../../decorators';
6-
import {STRATEGY} from '../../../../strategy-name.enum';
7-
import {getApp} from '../helpers/helpers';
8-
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
9-
import {Strategies} from '../../../../strategies/keys';
107
import {VerifyFunction} from '../../../../strategies';
11-
import {userWithoutReqObj} from '../../../fixtures/data/bearer-data';
12-
import * as GoogleStrategy from 'passport-google-oauth20';
8+
import {Strategies} from '../../../../strategies/keys';
139
import {GoogleAuthStrategyFactoryProvider} from '../../../../strategies/passport/passport-google-oauth2';
14-
import {ClientPasswordVerifyProvider} from '../../../fixtures/providers/passport-client.provider';
15-
import {ClientPasswordStrategyFactoryProvider} from '../../../../strategies/passport/passport-client-password';
10+
import {STRATEGY} from '../../../../strategy-name.enum';
11+
import {userWithoutReqObj} from '../../../fixtures/data/bearer-data';
12+
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
13+
import {getApp} from '../helpers/helpers';
1614

1715
describe('getting google oauth2 strategy with options', () => {
1816
let app: Application;
@@ -49,12 +47,6 @@ describe('getting google oauth2 strategy with options', () => {
4947
}
5048

5149
function getAuthVerifier() {
52-
app
53-
.bind(Strategies.Passport.OAUTH2_CLIENT_PASSWORD_VERIFIER)
54-
.toProvider(ClientPasswordVerifyProvider);
55-
app
56-
.bind(Strategies.Passport.CLIENT_PASSWORD_STRATEGY_FACTORY)
57-
.toProvider(ClientPasswordStrategyFactoryProvider);
5850
app
5951
.bind(Strategies.Passport.GOOGLE_OAUTH2_VERIFIER)
6052
.toProvider(GoogleAuthVerifyProvider);

src/__tests__/integration/action-sequence/passport-instagram-oauth2/instagram-oauth2.integration.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
import {Client, createClientForHandler} from '@loopback/testlab';
2-
import {RestServer, Request} from '@loopback/rest';
3-
import {Application, Constructor, Provider} from '@loopback/core';
1+
import {Application, Provider} from '@loopback/core';
42
import {get} from '@loopback/openapi-v3';
3+
import {Request, RestServer} from '@loopback/rest';
4+
import {Client, createClientForHandler} from '@loopback/testlab';
5+
import * as InstagramStrategy from 'passport-instagram';
56
import {authenticate} from '../../../../decorators';
6-
import {STRATEGY} from '../../../../strategy-name.enum';
7-
import {getApp} from '../helpers/helpers';
8-
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
9-
import {Strategies} from '../../../../strategies/keys';
107
import {VerifyCallback, VerifyFunction} from '../../../../strategies';
11-
import {userWithoutReqObj} from '../../../fixtures/data/bearer-data';
12-
import * as InstagramStrategy from 'passport-instagram';
8+
import {Strategies} from '../../../../strategies/keys';
139
import {InstagramAuthStrategyFactoryProvider} from '../../../../strategies/passport/passport-insta-oauth2';
14-
import {ClientPasswordVerifyProvider} from '../../../fixtures/providers/passport-client.provider';
15-
import {ClientPasswordStrategyFactoryProvider} from '../../../../strategies/passport/passport-client-password';
10+
import {STRATEGY} from '../../../../strategy-name.enum';
11+
import {userWithoutReqObj} from '../../../fixtures/data/bearer-data';
12+
import {MyAuthenticationSequence} from '../../../fixtures/sequences/authentication.sequence';
13+
import {getApp} from '../helpers/helpers';
1614

1715
describe('getting instagram oauth2 strategy with options', () => {
1816
let app: Application;
@@ -49,12 +47,6 @@ describe('getting instagram oauth2 strategy with options', () => {
4947
}
5048

5149
function getAuthVerifier() {
52-
app
53-
.bind(Strategies.Passport.OAUTH2_CLIENT_PASSWORD_VERIFIER)
54-
.toProvider(ClientPasswordVerifyProvider);
55-
app
56-
.bind(Strategies.Passport.CLIENT_PASSWORD_STRATEGY_FACTORY)
57-
.toProvider(ClientPasswordStrategyFactoryProvider);
5850
app
5951
.bind(Strategies.Passport.INSTAGRAM_OAUTH2_STRATEGY_FACTORY)
6052
.toProvider(InstagramAuthStrategyFactoryProvider);

0 commit comments

Comments
 (0)