Skip to content

Commit 63b7378

Browse files
authored
feat: Support OAuth Client Credentials Grant [HEAD-873] (#4970)
* feat: Support OAuth Client Credentials Grant * chore: improve help and remove obsolete test * fix: adapt test expectation to new behaviour * chore: added some basic oauth client cred tests * chore: run formatter * chore: remove test token to not interfer with other tests * chore: cleanup after auth test * fix: add missing return * chore: use final GAF commit
1 parent 0b6743c commit 63b7378

File tree

6 files changed

+77
-13
lines changed

6 files changed

+77
-13
lines changed

cliv2/cmd/cliv2/main.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ import (
2121
"github.com/snyk/cli-extension-dep-graph/pkg/depgraph"
2222
"github.com/snyk/cli-extension-iac-rules/iacrules"
2323
"github.com/snyk/cli-extension-sbom/pkg/sbom"
24-
"github.com/snyk/cli/cliv2/internal/cliv2"
25-
"github.com/snyk/cli/cliv2/internal/constants"
26-
"github.com/snyk/cli/cliv2/pkg/basic_workflows"
2724
"github.com/snyk/container-cli/pkg/container"
2825
"github.com/snyk/go-application-framework/pkg/analytics"
2926
"github.com/snyk/go-application-framework/pkg/app"
@@ -37,6 +34,10 @@ import (
3734
"github.com/snyk/go-httpauth/pkg/httpauth"
3835
"github.com/snyk/snyk-iac-capture/pkg/capture"
3936
snykls "github.com/snyk/snyk-ls/ls_extension"
37+
38+
"github.com/snyk/cli/cliv2/internal/cliv2"
39+
"github.com/snyk/cli/cliv2/internal/constants"
40+
"github.com/snyk/cli/cliv2/pkg/basic_workflows"
4041
)
4142

4243
var internalOS string
@@ -227,7 +228,8 @@ func sendAnalytics(analytics analytics.Analytics, debugLogger *zerolog.Logger) {
227228

228229
func help(_ *cobra.Command, args []string) error {
229230
helpProvided = true
230-
args = append(os.Args[1:], "--help")
231+
args = utils.RemoveSimilar(os.Args[1:], "--") // remove all double dash arguments to avoid issues with the help command
232+
args = append(args, "--help")
231233
return defaultCmd(args)
232234
}
233235

cliv2/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/snyk/cli-extension-iac-rules v0.0.0-20230601153200-c572cfce46ce
1414
github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a
1515
github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f
16-
github.com/snyk/go-application-framework v0.0.0-20231122083330-bbb0d2002b01
16+
github.com/snyk/go-application-framework v0.0.0-20231222162659-c767e4a7440b
1717
github.com/snyk/go-httpauth v0.0.0-20231117135515-eb445fea7530
1818
github.com/snyk/snyk-iac-capture v0.6.5
1919
github.com/snyk/snyk-ls v0.0.0-20231124091213-5a223c21e0aa

cliv2/go.sum

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,6 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR
255255
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
256256
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
257257
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
258-
github.com/cmars/go-application-framework v0.0.0-20231121235901-2a517c3dca80 h1:/ih3AkS+EPO51JoSgJCbS5D+5ErEEYQ5Kv3UDtBOhKU=
259-
github.com/cmars/go-application-framework v0.0.0-20231121235901-2a517c3dca80/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw=
260258
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
261259
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
262260
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -667,10 +665,8 @@ github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a h1:oRrk9bv
667665
github.com/snyk/cli-extension-sbom v0.0.0-20231123083311-52b1cecc1a7a/go.mod h1:IwRGWjRuNkY08O7NJb7u3JuQkroEB8Qi1MlASpZVu1Q=
668666
github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f h1:ghajT5PEiLP8XNFIdc7Yn4Th74RH/9Q++dDOp6Cb9eo=
669667
github.com/snyk/container-cli v0.0.0-20230920093251-fe865879a91f/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM=
670-
github.com/snyk/go-application-framework v0.0.0-20231121110922-9719383f0706 h1:z/g5P0kS7bedN07rNChlPEifKvAe9+hufGEEifPNcJg=
671-
github.com/snyk/go-application-framework v0.0.0-20231121110922-9719383f0706/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw=
672-
github.com/snyk/go-application-framework v0.0.0-20231122083330-bbb0d2002b01 h1:2WL20Lgh2YSifXNJ4zw3tZqX2Qa4CqM2C2m0+oWtKGw=
673-
github.com/snyk/go-application-framework v0.0.0-20231122083330-bbb0d2002b01/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw=
668+
github.com/snyk/go-application-framework v0.0.0-20231222162659-c767e4a7440b h1:NNiXGaKELaFmejlw5BOWf8dVThl8iisU9Yhx+FSUrL4=
669+
github.com/snyk/go-application-framework v0.0.0-20231222162659-c767e4a7440b/go.mod h1:Yz/qxFyfhf0xbA+z8Vzr5IM9IDG+BS+2PiGaP1yAsEw=
674670
github.com/snyk/go-httpauth v0.0.0-20231117135515-eb445fea7530 h1:s9PHNkL6ueYRiAKNfd8OVxlUOqU3qY0VDbgCD1f6WQY=
675671
github.com/snyk/go-httpauth v0.0.0-20231117135515-eb445fea7530/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg=
676672
github.com/snyk/policy-engine v0.22.0 h1:od9pduGrXyfWO791X+8M1qmnvWUxaIXh0gBzGKqeseA=

test/acceptance/fake-server.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,19 @@ export const fakeServer = (basePath: string, snykToken: string): FakeServer => {
577577
},
578578
);
579579

580+
app.post(basePath.replace('/v1', '') + '/oauth2/token', (req, res) => {
581+
const fake_oauth_token =
582+
'{"access_token":"access_token_value","token_type":"b","expiry":"3023-12-20T08:49:15.504539Z"}';
583+
584+
// client credentials grant: expecting client id = a and client secret = b
585+
if (req.headers.authorization?.includes('Basic YTpi')) {
586+
res.status(200).send(fake_oauth_token);
587+
return;
588+
}
589+
590+
res.status(401).send({});
591+
});
592+
580593
const listenPromise = (port: string | number) => {
581594
return new Promise<void>((resolve) => {
582595
server = http.createServer(app).listen(Number(port), resolve);

test/jest/acceptance/auth.spec.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { fakeServer } from '../../acceptance/fake-server';
2+
import { runSnykCLI } from '../util/runSnykCLI';
3+
4+
jest.setTimeout(1000 * 60);
5+
6+
describe('Auth', () => {
7+
let server: ReturnType<typeof fakeServer>;
8+
let env: Record<string, string>;
9+
10+
beforeAll((done) => {
11+
const apiPath = '/api/v1';
12+
const apiPort = process.env.PORT || process.env.SNYK_PORT || '12345';
13+
env = {
14+
...process.env,
15+
SNYK_API: 'http://localhost:' + apiPort + apiPath,
16+
SNYK_DISABLE_ANALYTICS: '1',
17+
};
18+
19+
server = fakeServer(apiPath, env.SNYK_TOKEN);
20+
server.listen(apiPort, () => done());
21+
});
22+
23+
afterEach(() => {
24+
server.restore();
25+
});
26+
27+
afterAll((done) => {
28+
server.close(() => done());
29+
});
30+
31+
it('successfully uses oauth client credentials grant to authenticate', async () => {
32+
const { code } = await runSnykCLI(
33+
`auth --auth-type=oauth --client-id a --client-secret b`,
34+
{
35+
env,
36+
},
37+
);
38+
expect(code).toEqual(0);
39+
40+
// delete test token
41+
await runSnykCLI(`config unset INTERNAL_OAUTH_TOKEN_STORAGE`, {
42+
env,
43+
});
44+
});
45+
46+
it('fails to us oauth client credentials grant to authenticate', async () => {
47+
const { code } = await runSnykCLI(
48+
`auth --auth-type=oauth --client-id wrong --client-secret b`,
49+
{
50+
env,
51+
},
52+
);
53+
expect(code).toEqual(2);
54+
});
55+
});

test/jest/acceptance/cli-args.spec.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,7 @@ describe('cli args', () => {
245245
});
246246

247247
[
248-
'auth',
249248
'config',
250-
'help',
251249
'ignore',
252250
'modules',
253251
'monitor',

0 commit comments

Comments
 (0)