(w http.ResponseWriter, r *http.Request)
| 391 | } |
| 392 | |
| 393 | func (h *handler) renewAccessToken(w http.ResponseWriter, r *http.Request) { |
| 394 | var req RenewAccessTokenReq |
| 395 | if err := json.NewDecoder(r.Body).Decode(&req); err != nil { |
| 396 | http.Error(w, "error decoding request body", http.StatusBadRequest) |
| 397 | return |
| 398 | } |
| 399 | |
| 400 | refreshClaims, err := h.TokenMaker.VerifyToken(req.RefreshToken) |
| 401 | if err != nil { |
| 402 | http.Error(w, "error verifying token", http.StatusUnauthorized) |
| 403 | return |
| 404 | } |
| 405 | |
| 406 | session, err := h.client.GetSession(h.ctx, &pb.SessionReq{ |
| 407 | Id: refreshClaims.RegisteredClaims.ID, |
| 408 | }) |
| 409 | if err != nil { |
| 410 | http.Error(w, "error getting session", http.StatusInternalServerError) |
| 411 | return |
| 412 | } |
| 413 | |
| 414 | if session.IsRevoked { |
| 415 | http.Error(w, "session revoked", http.StatusUnauthorized) |
| 416 | return |
| 417 | } |
| 418 | |
| 419 | if session.GetUserEmail() != refreshClaims.Email { |
| 420 | http.Error(w, "invalid session", http.StatusUnauthorized) |
| 421 | return |
| 422 | } |
| 423 | |
| 424 | accessToken, accessClaims, err := h.TokenMaker.CreateToken(refreshClaims.ID, refreshClaims.Email, refreshClaims.IsAdmin, 15*time.Minute) |
| 425 | if err != nil { |
| 426 | http.Error(w, "error creating token", http.StatusInternalServerError) |
| 427 | return |
| 428 | } |
| 429 | |
| 430 | res := RenewAccessTokenRes{ |
| 431 | AccessToken: accessToken, |
| 432 | AccessTokenExpiresAt: accessClaims.RegisteredClaims.ExpiresAt.Time, |
| 433 | } |
| 434 | |
| 435 | w.Header().Set("Content-Type", "application/json") |
| 436 | w.WriteHeader(http.StatusOK) |
| 437 | json.NewEncoder(w).Encode(res) |
| 438 | } |
| 439 | |
| 440 | func (h *handler) revokeSession(w http.ResponseWriter, r *http.Request) { |
| 441 | claims := r.Context().Value(authKey{}).(*token.UserClaims) |
nothing calls this directly
no test coverage detected