Chaeyeon0 / GreenDay_Study

여은개의 공부 일지
0 stars 0 forks source link

[20230603] 소셜 로그인 후 일기 작성할 수 있도록 코드 수정 #42

Open Chaeyeon0 opened 1 month ago

Chaeyeon0 commented 1 month ago

현재까지 코드의 문제점

  1. 네이버 소셜 로그인 이후 인증된 사용자만이 일기를 작성하도록 되어 있는 코드로 수정되어 있지 않음

    @AuthenticationPrincipal 어노테이션을 사용하여 현재 인증된 사용자의 정보를 가져와야 한다.

첫번째 변경사항 스크린샷 2024-06-03 002623 SecurityConfig에 /write_diary 경로에 대한 인증 요구 추가하여 인증된 사용자만이 들어갈 수 있도록 함

package com.example.controller;
import com.example.dto.DiaryDto;
import com.example.dto.CustomOauth2UserDetails;
import com.example.service.Diaryservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DiaryController {
    private final Diaryservice diaryService;

    @Autowired
    public DiaryController(Diaryservice diaryService) {
        this.diaryService = diaryService;
    }

    @PostMapping("/write_diary")
    public ResponseEntity<String> writeDiary(@RequestBody DiaryDto diaryDto, @AuthenticationPrincipal CustomOauth2UserDetails principal) {
        // 소셜 로그인 사용자 정보에서 login_id 설정
        String loginId = principal.getMember().getLoginId(); // 사용자의 아이디를 가져옴
        diaryDto.setLogin_id(loginId);
        diaryService.writeDiary(diaryDto);
        String responseBody = "저장이 완료되었습니다";
        return ResponseEntity.status(HttpStatus.CREATED).body(responseBody);
    }
}

@AuthenticationPrincipal CustomOauth2UserDetails principal 어노테이션은 현재 인증된 사용자의 정보를 주입하고. 여기서는 네이버 소셜 로그인으로부터 제공받은 사용자 정보를 담고 있는 CustomOauth2UserDetails 객체를 주입합니다 !! CustomOauth2UserDetails 클래스의 getMember() 메서드를 사용하여 사용자의 정보에 접근하고, 그 안에 있는 getLoginId() 메서드를 호출하여 사용자의 아이디를 가져오도록 한다. 이렇게 하면 클라이언트가 일기를 작성할 때 사용자의 아이디를 가져올 수 있다 ..

package com.example.dto;

import com.example.domain.entity.DiaryEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDate;

@Getter
@Setter
@NoArgsConstructor
public class DiaryDto {
    private Long diary_id;
    private String diary_content;
    private LocalDate regdate;
    private String login_id;

    @Builder
    public DiaryDto(Long diary_id, String diary_content, LocalDate regdate, String login_id) {
        this.diary_id = diary_id;
        this.diary_content = diary_content;
        this.regdate = regdate;
        this.login_id = login_id;
    }

    public DiaryEntity toEntity() {
        return DiaryEntity.builder()
                .diary_content(diary_content)
                .regdate(regdate)
                .diary_id(diary_id)
                .login_id(login_id)
                .build();
    }
}

DTO도 수정 완료 !! 현재 빌드는 잘 되고 있는 상태

여기서 POSTMAN으로 토큰 받아서 성공하면 일기 연동 들어가겠습니다

스크린샷 2024-06-01 135221

왜 저장이 된다고 안 뜨고 login만 뜰까요 ,,, 왜 다른 컨트롤러의 응답이 나오는지 계속 지피티한테 물어보고 코드 수정도 하고 했는데 ,,

java 코드 복사 @PostMapping("/write_diary") public ResponseEntity writeDiary(@RequestBody DiaryDto diaryDto, @AuthenticationPrincipal CustomOauth2UserDetails principal) { // 소셜 로그인 사용자 정보에서 login_id 설정 String loginId = principal.getMember().getLoginId(); // 사용자의 아이디를 가져옴 diaryDto.setLogin_id(loginId); diaryService.writeDiary(diaryDto); String responseBody = "저장이 완료되었습니다"; return ResponseEntity.status(HttpStatus.CREATED).body(responseBody); } 그런데 /write_diary에 대한 POST 요청을 보내고 난 후 "저장이 완료되었습니다"가 나오지 않는다면, 클라이언트에서 어떤 응답을 받았는지 확인해야 합니다. 보통은 서버 측의 오류가 아닌 클라이언트 측에서의 문제일 가능성이 높습니다.

다음으로 SecurityLoginController에서 /greenday/login 엔드포인트를 처리하고 있다. 이는 로그인 페이지를 반환하고 따라서 /write_diary로 요청을 보내기 전에 /greenday/login 엔드포인트를 먼저 요청하여 로그인을 수행해야 함. 그렇지 않으면 요청은 인증되지 않은 상태로 처리될 수 있다.

Q. 요청은 인증되지 않은 상태로 처리될 수 있다고 했는데 postman으로 테스트 했을 때 /greenday/login여기에 대한 반응이 나오는게 당연한거야..?

A. 로그인 후에 POSTMAN에서 /write_diary 엔드포인트로 요청을 보내야 합니다. 로그인 페이지는 브라우저 환경에서만 정상적으로 작동함 !!! 실제 웹 브라우저에서 해당 페이지를 방문하고 로그인한 후에 POSTMAN에서 /write_diary 엔드포인트로 요청을 보내면 됩니다. 이렇게 하면 로그인이 수행되고, /write_diary 엔드포인트에서는 사용자를 인증할 수 있게 된다.

Q. 그러면 로그인 연동이 다 되고 나서 해야 된다는 뜻이야..? A. 네, 맞습니다. 로그인이 완료된 후에 인증된 세션 또는 토큰을 통해 요청을 보내야 합니다. 일반적으로 웹 애플리케이션에서는 사용자가 로그인한 후에 해당 세션 또는 토큰을 유지하고, 이를 사용하여 인증된 요청을 보냅니다. 따라서 로그인 프로세스를 완료하고 세션이나 토큰을 발급받은 후에 POSTMAN을 사용하여 요청을 보내면 됩니다. 이렇게 하면 인증된 요청이 서버에 전달되어 정상적으로 처리됩니다.