Skip to content

Commit 8d02d02

Browse files
change desription and fix issue for 2.0
1 parent ba2edfc commit 8d02d02

File tree

3 files changed

+105
-10
lines changed

3 files changed

+105
-10
lines changed

docs/reference/openapi-rules.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,65 @@ TheBadModel:
479479
type: array
480480
```
481481

482+
### security-scheme-name
483+
484+
Security scheme name must not contain whitespace.
485+
486+
Security scheme names are used as identifiers in OpenAPI documents and should follow a consistent naming pattern. This rule ensures that the `name` property within security scheme definitions only contains alphanumeric characters, dots (.), underscores (_), and hyphens (-), preventing issues with whitespace or special characters.
487+
488+
This rule applies to OpenAPI v2.0, v3.0, and v3.1.
489+
490+
**Recommended:** Yes
491+
492+
**Good Example**
493+
494+
For OpenAPI v3.0 and v3.1:
495+
496+
```yaml
497+
components:
498+
securitySchemes:
499+
api_key:
500+
type: apiKey
501+
name: api-key.v1
502+
in: header
503+
bearer_auth:
504+
type: http
505+
scheme: bearer
506+
```
507+
508+
For OpenAPI v2.0:
509+
510+
```yaml
511+
securityDefinitions:
512+
api_key:
513+
type: apiKey
514+
name: X-API-Key
515+
in: header
516+
```
517+
518+
**Bad Example**
519+
520+
For OpenAPI v3.0 and v3.1:
521+
522+
```yaml
523+
components:
524+
securitySchemes:
525+
api_key:
526+
type: apiKey
527+
name: api key with spaces
528+
in: header
529+
```
530+
531+
For OpenAPI v2.0:
532+
533+
```yaml
534+
securityDefinitions:
535+
api_key:
536+
type: apiKey
537+
name: X-API Key
538+
in: header
539+
```
540+
482541
## OpenAPI v2.0-only
483542

484543
These rules will only apply to OpenAPI v2.0 documents.

packages/rulesets/src/oas/__tests__/security-scheme-name.test.ts

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ testRule('security-scheme-name', [
44
{
55
name: 'valid case - simple alphanumeric name',
66
document: {
7-
openapi: '3.0.2',
7+
openapi: '3.0.0',
88
components: {
99
securitySchemes: {
1010
apikey: {
@@ -21,7 +21,7 @@ testRule('security-scheme-name', [
2121
{
2222
name: 'valid case - name with allowed special characters',
2323
document: {
24-
openapi: '3.0.2',
24+
openapi: '3.0.0',
2525
components: {
2626
securitySchemes: {
2727
oauth2: {
@@ -64,10 +64,27 @@ testRule('security-scheme-name', [
6464
errors: [],
6565
},
6666

67+
{
68+
name: 'valid case - OAS 3.1 security scheme',
69+
document: {
70+
openapi: '3.1.0',
71+
components: {
72+
securitySchemes: {
73+
bearer_token: {
74+
type: 'http',
75+
scheme: 'bearer',
76+
name: 'Bearer-Token_v1',
77+
},
78+
},
79+
},
80+
},
81+
errors: [],
82+
},
83+
6784
{
6885
name: 'invalid case - name with spaces',
6986
document: {
70-
openapi: '3.0.2',
87+
openapi: '3.0.0',
7188
components: {
7289
securitySchemes: {
7390
apikey: {
@@ -88,7 +105,7 @@ testRule('security-scheme-name', [
88105
{
89106
name: 'invalid case - name with special characters',
90107
document: {
91-
openapi: '3.0.2',
108+
openapi: '3.0.0',
92109
components: {
93110
securitySchemes: {
94111
oauth2: {
@@ -115,7 +132,7 @@ testRule('security-scheme-name', [
115132
{
116133
name: 'invalid case - name with parentheses and brackets',
117134
document: {
118-
openapi: '3.0.2',
135+
openapi: '3.0.0',
119136
components: {
120137
securitySchemes: {
121138
basic: {
@@ -136,7 +153,7 @@ testRule('security-scheme-name', [
136153
{
137154
name: 'mixed case - valid and invalid names',
138155
document: {
139-
openapi: '3.0.2',
156+
openapi: '3.0.0',
140157
components: {
141158
securitySchemes: {
142159
validApiKey: {
@@ -167,7 +184,7 @@ testRule('security-scheme-name', [
167184
{
168185
name: 'edge case - empty name',
169186
document: {
170-
openapi: '3.0.2',
187+
openapi: '3.0.0',
171188
components: {
172189
securitySchemes: {
173190
apikey: {
@@ -188,7 +205,7 @@ testRule('security-scheme-name', [
188205
{
189206
name: 'valid case - numeric only name',
190207
document: {
191-
openapi: '3.0.2',
208+
openapi: '3.0.0',
192209
components: {
193210
securitySchemes: {
194211
apikey: {
@@ -201,4 +218,23 @@ testRule('security-scheme-name', [
201218
},
202219
errors: [],
203220
},
221+
222+
{
223+
name: 'invalid case - OAS 2.0 name with spaces',
224+
document: {
225+
swagger: '2.0',
226+
securityDefinitions: {
227+
api_key: {
228+
type: 'apiKey',
229+
name: 'X-API Key',
230+
in: 'header',
231+
},
232+
},
233+
},
234+
errors: [
235+
{
236+
message: '"X-API Key" must match the pattern "^[a-zA-Z0-9._-]+$"',
237+
},
238+
],
239+
},
204240
]);

packages/rulesets/src/oas/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -769,13 +769,13 @@ const ruleset = {
769769
},
770770
},
771771
'security-scheme-name': {
772-
description: 'Ensure that security scheme should have valid name',
772+
description: 'Security scheme name must not contain whitespace.',
773773
message: '{{error}}',
774774
severity: 0,
775775
formats: [oas2, oas3],
776776
recommended: true,
777777
resolved: false,
778-
given: '$.components.securitySchemes[*].name',
778+
given: ['$.components.securitySchemes[*].name', '$.securityDefinitions[*].name'],
779779
then: {
780780
function: pattern,
781781
functionOptions: {

0 commit comments

Comments
 (0)