Authentification des Utilisateurs dans l'API
Maintenant que le login est configuré, vous pouvez ajouter deux nouvelles routes pour créer et supprimer des posts. Leur accès sera limité aux utilisateurs authentifiés.
Point de terminaison | Méthode | Description |
---|---|---|
/api/stories | POST | Crée un nouveau post. |
/api/stories/:storyId | DELETE | Supprime un post. |
Ouvrez le fichier stories.controller.ts
et ajoutez deux nouvelles méthodes au contrôleur.
import { Context, Delete, Get, HttpResponseCreated, HttpResponseNoContent, HttpResponseNotFound, HttpResponseOK, Post, UserRequired, ValidateBody, ValidatePathParam, ValidateQueryParam } from '@foal/core';
import { Story, User } from '../../entities';
export class StoriesController {
// readStories...
@Post()
@ValidateBody({
type: 'object',
properties: {
title: { type: 'string', maxLength: 255 },
link: { type: 'string', maxLength: 255 },
},
required: [ 'title', 'link' ],
additionalProperties: false,
})
@UserRequired()
async createStory(ctx: Context) {
const story = new Story();
story.title = ctx.request.body.title;
story.link = ctx.request.body.link;
// Set the current user as the author of the story.
story.author = ctx.user;
await story.save();
return new HttpResponseCreated();
}
@Delete('/:storyId')
@ValidatePathParam('storyId', { type: 'number' })
@UserRequired()
async deleteStory(ctx: Context<User>, { storyId }: { storyId: number }) {
// Only retrieve stories whose author is the current user.
const story = await Story.findOne({ id: storyId, author: ctx.user });
if (!story) {
return new HttpResponseNotFound();
}
await story.remove();
return new HttpResponseNoContent();
}
}
Lors de l'envoi d'une requête à ces points de terminaison, le hook @UserRequired
retournera une erreur 401 si ctx.user
n'est pas défini (c'est-à-dire si l'utilisateur ne s'est pas connecté au préalable). Mais s'il l'est, la méthode du contrôleur sera exécutée.
Allez sur http://localhost:3001/swagger et vérifiez que le contrôleur fonctionne comme prévu. Vous pouvez, par exemple, essayer de créer un post sans être connecté, puis vous connecter et réessayer.