Skip to content

Commit

Permalink
update docs
Browse files Browse the repository at this point in the history
  • Loading branch information
clarktozer committed Feb 25, 2021
1 parent 575b449 commit ed21021
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 5 deletions.
3 changes: 2 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
"singleQuote": false,
"arrowParens": "avoid",
"tabWidth": 4,
"endOfLine": "auto"
"endOfLine": "auto",
"trailingComma": "none"
}
80 changes: 79 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,80 @@
# type-graphql-csrf-middleware
TypeGraphQL middleware for handling csrf tokens

TypeGraphQL middleware for handling csrf tokens with an express server with express-sessions.

Required Peer Dependencies:

- express
- express-session
- crsf
- cookie-parser
- graphql
- type-graphql

## Installation

```bash
npm install type-graphql-csrf-middleware

yarn add type-graphql-csrf-middleware
```

```bash
import { ValidAntiForgeryToken } from "type-graphql-csrf-middleware";
```
## Getting Started
Your express server will need to add a csrf token as a cookie and a csrf secret to the session.
Below is an example express route middleware to add the tokens.
```javascript
const addCsrf = (req: Request, res: Response, next: NextFunction) => {
const tokens = new Tokens();
const secret = tokens.secretSync();
const token = tokens.create(secret);

res.cookie("csrfToken", token);
req.session.csrfSecret = secret;

next();
};
```
## Resolver Middleware Use
The type-graphql middleware needs a cookie key and a session key in order to verify the token.
```javascript
import { ValidAntiForgeryToken } from "type-graphql-csrf-middleware";

@Resolver(User)
export class UserResolver {
@Query(() => User)
@UseMiddleware(ValidAntiForgeryToken({ cookieKey: "csrfToken", secretKey: "csrfSecret" }))
async me(@Ctx() ctx: MyContext): Promise<User | undefined> {
{...}
}
}
```
The middleware can also be reusable between resolvers and resolver functions.
```javascript
import { ValidAntiForgeryToken } from "type-graphql-csrf-middleware";

const Authorized = ValidAntiForgeryToken({
cookieKey: "csrfToken",
secretKey: "csrfSecret",
message: "Access Denied!"
});

@Resolver(User)
export class UserResolver {
@Query(() => User)
@UseMiddleware(Authorized)
async me(@Ctx() ctx: MyContext): Promise<User | undefined> {
{...}
}
}
```
6 changes: 3 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,18 @@ interface IContext {

export interface ValidAntiForgeryTokenProps {
cookieKey: string;
sessionKey: string;
secretKey: string;
message?: string;
}

export const ValidAntiForgeryToken = <T extends IContext>({
cookieKey,
message = "Unauthorized",
sessionKey,
secretKey
}: ValidAntiForgeryTokenProps): MiddlewareFn<T> => ({ context }, next) => {
const tokens = new Tokens();
const token = context.req.cookies[cookieKey];
const secret = context.req.session[sessionKey];
const secret = context.req.session[secretKey];

if (!secret || !tokens.verify(secret, token)) {
throw new Error(message);
Expand Down

0 comments on commit ed21021

Please sign in to comment.