Storing the User that Created Restaurants and Reviews
Reading
Storing the User that Created Restaurants and Reviews
If we want to store the user that created a restaurant or a review, we need to
add some details to the models. Specifically, we will need to store the UserId
value in both of these models.
Add the following to both Restaurant
and Review
public int UserId { get; set; }public User User { get; set; }
Once added, we can run a single migration that will update both of these tables.
dotnet ef migrations add AddUserIdToRestaurantAndReview
and run the migrations
dotnet ef database update
Storing the related user
We could have the client send their Id
along with the request to create a
restaurant and review. However, the current user id is not data we want to trust
to the API. Since anyone could change that value when sending a request we want
the server to control associating that data. Thus, we want to provide the
two controllers with a way to determine the current user's id.
We can add a helper to our controller just after the last method of the
controller in RestaurantsController.cs
// Private helper method to get the JWT claim related to the user IDprivate int GetCurrentUserId(){// Get the User Id from the claim and then parse it as an integer.return int.Parse(User.Claims.FirstOrDefault(claim => claim.Type == "Id").Value);}
We can then use this in our PostRestaurant method to help ensure we have user IDs assigned.
To require a user to be logged in (have a valid JWT) add this line before the
PostRestaurant
method:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
To assign a user to the restaurant, we will add this code to the beginning of
the PostRestaurant
implementation:
// Set the UserID to the current user id, this overrides anything the user specifies.restaurant.UserId = GetCurrentUserId();
Finally, lets send our authorization header token when making the request in
NewRestaurant.tsx
. The ...authHeader()
means to take all the information
that authHeader
returns and add those keys and corresponding values to the
collection of headers.
headers: { 'content-type': 'application/json', Authorization: authHeader() },
Then we will make similar updates in the ReviewsController
.
To assign a user to the review, we will add this code to the beginning of the
PostReview
implementation:
// Set the UserID to the current user id, this overrides anything the user specifies.review.UserId = GetCurrentUserId();
Update Restaurant.tsx
:
headers: { 'content-type': 'application/json', Authorization: authHeader() },