Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,25 @@ public ResponseEntity<ApiResponse<LoginResponseDTO>> loginWithKakao(@Valid @Requ
return ApiResponse.success(SuccessStatus.SEND_LOGIN_SUCCESS, response);
}

@Operation(
summary = "애플 로그인 API",
description = "애플 인가코드을 통해 사용자의 정보를 등록 및 토큰 + 역할을 발급합니다." +
"<br>- type: 환경에 따라 local 또는 deploy를 보내주세요" +
"<br>- [enum]ROLE -> 처음사용자 : GUEST, 일반사용자 : USER, 관리자 : ADMIN"
)
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "로그인 성공"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "인가코드가 입력되지 않았습니다."),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "유효하지 않은 인가코드 입니다."),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "로그인 서버 오류 발생")
})
@PostMapping("/apple/login")
public ResponseEntity<ApiResponse<LoginResponseDTO>> loginWithApple(@Valid @RequestBody LoginRequestDTO loginRequestDTO) {

LoginResponseDTO response = memberService.loginWithApple(loginRequestDTO.getCode(), loginRequestDTO.getType());
return ApiResponse.success(SuccessStatus.SEND_LOGIN_SUCCESS, response);
}

@Operation(
summary = "사용자 정보 조회 API",
description = "토큰을 통해 인증된 사용자의 정보를 반환합니다. userId 쿼리 파라미터가 없으면 본인 정보를 조회하고, 있으면 해당 사용자의 정보를 조회합니다." +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,10 @@ public class AccessTokenResponseDTO {
// JSON의 access_token 필드를 이 변수에 매핑
@JsonProperty("access_token")
private String accessToken;

@JsonProperty("refresh_token")
private String refreshToken;

@JsonProperty("id_token")
private String idToken;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.moongeul.backend.api.member.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AppleInfoResponseDTO {

private String id;
private String email;
private String name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.moongeul.backend.api.member.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

@Getter
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ApplePublicKeysResponseDTO {

private List<ApplePublicKey> keys;

@Getter
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public static class ApplePublicKey {
private String kid;
private String alg;
private String n;
private String e;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.moongeul.backend.api.member.dto;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class AppleTokenHeaderDTO {

private String kid;
private String alg;
}
11 changes: 11 additions & 0 deletions src/main/java/com/moongeul/backend/api/member/entity/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ public class Member extends BaseTimeEntity {

private String refreshToken; // Refresh Token

@Column(length = 2000)
private String socialRefreshToken; // OAuth Refresh Token

@Builder.Default
@Column(nullable = false)
private boolean isPushEnabled = true; // 푸시알림 허용, 기본값: ON
Expand All @@ -70,6 +73,13 @@ public void updateRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}

/**
* 소셜 리프레시 토큰 업데이트
*/
public void updateSocialRefreshToken(String socialRefreshToken) {
this.socialRefreshToken = socialRefreshToken;
}

/**
* 독서 취향 유형 업데이트
*/
Expand Down Expand Up @@ -116,6 +126,7 @@ public void updatePushEnabled(boolean isPushEnabled) {
public void withdrawMember() {
this.socialId = null; // 재가입 가능하도록 null 처리
this.refreshToken = null;
this.socialRefreshToken = null;
this.nickname = "(알 수 없음)";
this.profileImage = null;
this.name = null; // 실명 정보 삭제
Expand Down
Loading
Loading