Skip to content

Commit f33897f

Browse files
Merge pull request #524 from codex-team/fix/check-auth-for-every-request
fix(auth): Check auth in every request
2 parents 3b12eb6 + 4b100af commit f33897f

File tree

9 files changed

+57
-44
lines changed

9 files changed

+57
-44
lines changed

.github/workflows/build-and-push-docker-image.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: Build and push docker image
33
on:
44
push:
55
branches:
6-
- '*'
6+
- '**'
77
tags:
88
- 'v*'
99

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "hawk.api",
3-
"version": "1.1.36",
3+
"version": "1.1.38",
44
"main": "index.ts",
55
"license": "UNLICENSED",
66
"scripts": {
Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,37 +20,50 @@ function checkUser(context: ResolverContextBase): void {
2020
}
2121
}
2222

23-
export default function requireAuthDirective(directiveName = 'requireAuth') {
23+
export default function allowAnonDirective(directiveName = 'allowAnon') {
2424
return {
25-
requireAuthDirectiveTypeDefs: `
25+
allowAnonDirectiveTypeDefs: `
2626
"""
27-
Access to the field only to authorized users
27+
Allow access to the field to anonymous users
2828
"""
2929
directive @${directiveName} on FIELD_DEFINITION
3030
`,
31-
requireAuthDirectiveTransformer: (schema: GraphQLSchema) =>
31+
allowAnonDirectiveTransformer: (schema: GraphQLSchema) =>
3232
mapSchema(schema, {
3333
[MapperKind.OBJECT_FIELD]: (fieldConfig, fieldName) => {
34-
const requireAuthDirective = getDirective(schema, fieldConfig, directiveName)?.[0];
34+
const allowAnonDirective = getDirective(schema, fieldConfig, directiveName)?.[0];
3535

36-
if (requireAuthDirective) {
36+
if (allowAnonDirective) {
37+
/** Append flag isAnonAllowed to request context */
3738
const {
3839
resolve = defaultFieldResolver,
3940
} = fieldConfig;
4041

41-
/**
42-
* New field resolver
43-
* @param resolverArgs - default GraphQL resolver args
44-
*/
4542
fieldConfig.resolve = async function (...resolverArgs): UnknownGraphQLResolverResult {
4643
const [, , context] = resolverArgs;
4744

48-
checkUser(context);
45+
context.isAnonAllowed = true;
4946

5047
return resolve.apply(this, resolverArgs);
5148
};
49+
50+
return fieldConfig;
5251
}
5352

53+
const {
54+
resolve = defaultFieldResolver,
55+
} = fieldConfig;
56+
57+
fieldConfig.resolve = async function (...resolverArgs): UnknownGraphQLResolverResult {
58+
const [, , context] = resolverArgs;
59+
60+
if (!context.isAnonAllowed) {
61+
checkUser(context);
62+
}
63+
64+
return resolve.apply(this, resolverArgs);
65+
};
66+
5467
return fieldConfig;
5568
},
5669
}),

src/schema.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ import { mergeTypeDefs } from '@graphql-tools/merge';
66
import defaultValueDirective from './directives/defaultValue';
77
import validateDirective from './directives/validate';
88
import uploadImageDirective from './directives/uploadImageDirective';
9-
import requireAuthDirective from './directives/requireAuth';
9+
import allowAnonDirective from './directives/allowAnon';
1010
import requireAdminDirective from './directives/requireAdmin';
1111
import requireUserInWorkspaceDirective from './directives/requireUserInWorkspace';
1212

1313
const { renameFromDirectiveTypeDefs, renameFromDirectiveTransformer } = renameFromDirective();
1414
const { defaultValueDirectiveTypeDefs, defaultValueDirectiveTransformer } = defaultValueDirective();
1515
const { validateDirectiveTypeDefs, validateDirectiveTransformer } = validateDirective();
1616
const { uploadImageDirectiveTypeDefs, uploadImageDirectiveTransformer } = uploadImageDirective();
17-
const { requireAuthDirectiveTypeDefs, requireAuthDirectiveTransformer } = requireAuthDirective();
17+
const { allowAnonDirectiveTypeDefs, allowAnonDirectiveTransformer } = allowAnonDirective();
1818
const { requireAdminDirectiveTypeDefs, requireAdminDirectiveTransformer } = requireAdminDirective();
1919
const { requireUserInWorkspaceDirectiveTypeDefs, requireUserInWorkspaceDirectiveTransformer } = requireUserInWorkspaceDirective();
2020

@@ -24,7 +24,7 @@ let schema = makeExecutableSchema({
2424
defaultValueDirectiveTypeDefs,
2525
validateDirectiveTypeDefs,
2626
uploadImageDirectiveTypeDefs,
27-
requireAuthDirectiveTypeDefs,
27+
allowAnonDirectiveTypeDefs,
2828
requireAdminDirectiveTypeDefs,
2929
requireUserInWorkspaceDirectiveTypeDefs,
3030
...typeDefs,
@@ -36,8 +36,8 @@ schema = renameFromDirectiveTransformer(schema);
3636
schema = defaultValueDirectiveTransformer(schema);
3737
schema = validateDirectiveTransformer(schema);
3838
schema = uploadImageDirectiveTransformer(schema);
39-
schema = requireAuthDirectiveTransformer(schema);
4039
schema = requireAdminDirectiveTransformer(schema);
40+
schema = allowAnonDirectiveTransformer(schema);
4141
schema = requireUserInWorkspaceDirectiveTransformer(schema);
4242

4343
export default schema;

src/typeDefs/billing.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -277,12 +277,12 @@ extend type Query {
277277
"""
278278
Get workspace billing history
279279
"""
280-
businessOperations("Workspaces IDs" ids: [ID!] = []): [BusinessOperation!]! @requireAuth @requireAdmin
280+
businessOperations("Workspaces IDs" ids: [ID!] = []): [BusinessOperation!]! @requireAdmin
281281
282282
"""
283283
Prepare payment data before charge (GraphQL version of composePayment)
284284
"""
285-
composePayment(input: ComposePaymentInput!): ComposePaymentResponse! @requireAuth
285+
composePayment(input: ComposePaymentInput!): ComposePaymentResponse!
286286
}
287287
288288
"""
@@ -324,18 +324,18 @@ extend type Mutation {
324324
"""
325325
Remove card
326326
"""
327-
removeCard(cardNumber: String!): Boolean! @requireAuth
327+
removeCard(cardNumber: String!): Boolean!
328328
329329
"""
330330
Mutation for processing payment with saved card
331331
"""
332332
payWithCard(
333333
input: PayWithCardInput!
334-
): PayWithCardResponse! @requireAuth
334+
): PayWithCardResponse!
335335
336336
"""
337337
Returns JSON data with payment link and initiate card attach procedure
338338
"""
339-
attachCard(language: String): BillingSession! @requireAuth
339+
attachCard(language: String): BillingSession!
340340
}
341341
`;

src/typeDefs/event.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ type Event {
290290
User's local timezone offset in minutes
291291
"""
292292
timezoneOffset: Int! = 0
293-
): [ChartDataItem!]! @requireAuth
293+
): [ChartDataItem!]!
294294
}
295295
296296
"""
@@ -332,7 +332,7 @@ type Subscription {
332332
"""
333333
Sends new events from all user projects
334334
"""
335-
eventOccurred: Event! @requireAuth
335+
eventOccurred: Event!
336336
}
337337
338338
"""
@@ -404,14 +404,14 @@ type EventsMutations {
404404
"""
405405
updateAssignee(
406406
input: UpdateAssigneeInput!
407-
): UpdateAssigneeResponse! @requireAuth @requireUserInWorkspace
407+
): UpdateAssigneeResponse! @requireUserInWorkspace
408408
409409
"""
410410
Remove an assignee from the selected event
411411
"""
412412
removeAssignee(
413413
input: RemoveAssigneeInput!
414-
): RemoveAssigneeResponse! @requireAuth @requireUserInWorkspace
414+
): RemoveAssigneeResponse! @requireUserInWorkspace
415415
}
416416
417417
extend type Mutation {
@@ -428,7 +428,7 @@ extend type Mutation {
428428
ID of the event to visit
429429
"""
430430
eventId: ID!
431-
): Boolean! @requireAuth
431+
): Boolean!
432432
433433
"""
434434
Mutation sets or unsets passed mark to event
@@ -448,7 +448,7 @@ extend type Mutation {
448448
Mark to set
449449
"""
450450
mark: EventMark!
451-
): Boolean! @requireAuth
451+
): Boolean!
452452
453453
"""
454454
Namespace that contains only mutations related to the events

src/typeDefs/user.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export default gql`
9090
"""
9191
Returns authenticated user data
9292
"""
93-
me: User @requireAuth
93+
me: User
9494
}
9595
9696
extend type Mutation {
@@ -107,7 +107,7 @@ export default gql`
107107
UTM parameters
108108
"""
109109
utm: UtmInput
110-
): ${isE2E ? 'String!' : 'Boolean!'}
110+
): ${isE2E ? 'String!' : 'Boolean!'} @allowAnon
111111
112112
"""
113113
Login user with provided email and password
@@ -122,7 +122,7 @@ export default gql`
122122
User password
123123
"""
124124
password: String! @validate(notEmpty: true)
125-
): Tokens!
125+
): Tokens! @allowAnon
126126
127127
"""
128128
Update user's tokens pair
@@ -132,7 +132,7 @@ export default gql`
132132
Refresh token for getting new token pair
133133
"""
134134
refreshToken: String!
135-
): Tokens!
135+
): Tokens! @allowAnon
136136
137137
"""
138138
Reset user's password
@@ -142,7 +142,7 @@ export default gql`
142142
User email
143143
"""
144144
email: String! @validate(isEmail: true)
145-
): Boolean!
145+
): Boolean! @allowAnon
146146
147147
"""
148148
Update user's profile
@@ -162,7 +162,7 @@ export default gql`
162162
User image file
163163
"""
164164
image: Upload @uploadImage
165-
): Boolean! @requireAuth
165+
): Boolean!
166166
167167
"""
168168
Change user password
@@ -177,6 +177,6 @@ export default gql`
177177
New user password
178178
"""
179179
newPassword: String! @validate(notEmpty: true)
180-
): Boolean! @requireAuth
180+
): Boolean!
181181
}
182182
`;

src/typeDefs/userNotificationsMutations.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export default gql`
3232
Channel data to update
3333
"""
3434
input: NotificationsChannelsInput!
35-
): changeUserNotificationsChannelResponse! @requireAuth
35+
): changeUserNotificationsChannelResponse!
3636
3737
"""
3838
Toggle user notifications receive type active status
@@ -42,6 +42,6 @@ export default gql`
4242
Receive type with its new is-enabled value
4343
"""
4444
input: ChangeUserNotificationsReceiveTypeInput!
45-
): changeUserNotificationsReceiveTypeResponse! @requireAuth
45+
): changeUserNotificationsReceiveTypeResponse!
4646
}
4747
`;

src/typeDefs/workspace.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,15 @@ export default gql`
130130
Project(s) id(s)
131131
"""
132132
ids: [ID!] = []
133-
): [Project!] @requireAuth
133+
): [Project!]
134134
}
135135
136136
extend type Query {
137137
"""
138138
Returns workspace(s) info
139139
If ids = [] returns all user's workspaces
140140
"""
141-
workspaces("Workspace(s) id(s)" ids: [ID] = []): [Workspace] @requireAuth
141+
workspaces("Workspace(s) id(s)" ids: [ID] = []): [Workspace]
142142
}
143143
144144
extend type Mutation {
@@ -160,7 +160,7 @@ export default gql`
160160
New workspace image
161161
"""
162162
image: Upload @uploadImage
163-
): Workspace! @requireAuth
163+
): Workspace!
164164
165165
"""
166166
Invite user to workspace
@@ -176,7 +176,7 @@ export default gql`
176176
id of the workspace to which the user is invited
177177
"""
178178
workspaceId: ID!
179-
): Boolean! @requireAuth
179+
): Boolean!
180180
181181
"""
182182
Update workspace settings
@@ -211,7 +211,7 @@ export default gql`
211211
Workspace invite hash from link
212212
"""
213213
inviteHash: String!
214-
): UpdateWorkspaceResponse! @requireAuth
214+
): UpdateWorkspaceResponse!
215215
216216
"""
217217
Confirm invitation to workspace
@@ -227,7 +227,7 @@ export default gql`
227227
Id of the workspace to which the user was invited
228228
"""
229229
workspaceId: ID!
230-
): UpdateWorkspaceResponse! @requireAuth
230+
): UpdateWorkspaceResponse!
231231
232232
"""
233233
Grant admin permissions
@@ -280,6 +280,6 @@ export default gql`
280280
Workspace ID
281281
"""
282282
workspaceId: ID!
283-
): Boolean! @requireAuth
283+
): Boolean!
284284
}
285285
`;

0 commit comments

Comments
 (0)