Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 회원 annotation 기능 추가 및 테스트 인터페이스 제공 #62

Merged
merged 69 commits into from
Nov 13, 2023
Merged
Show file tree
Hide file tree
Changes from 67 commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
2cb3959
feat: 회원 엔티티 생성 및 테스트코드 추가
parksey Oct 29, 2023
3c119f8
feat: 카카오 OAuth 환경변수 추가 및 클래스 바인딩
parksey Oct 29, 2023
729d7d2
feat: authorization code를 받기 위한 queryString generator 추가
parksey Oct 29, 2023
9cbfc2e
feat: Authorization code의 parameter 만드는 로직 분리 및 테스트 코드 추가
parksey Oct 30, 2023
e056905
feat: 회원 가입/로그인 요청 api 및 소셜 로그인 페이지 반환
parksey Oct 30, 2023
0dc50e4
refactor: member관련 클래스 네이밍과 폴더 위치 변경
parksey Oct 30, 2023
233661a
refactor: 로그인 페이지 요청 방식 Resttemplate -> response (redirect)하도록 변경
parksey Oct 30, 2023
18f3496
style: 코드 포맷 재적용 및 사용하지 않는 클래스 삭제
parksey Oct 30, 2023
a1e7533
chore: config 파일 업데이트
parksey Oct 30, 2023
b5163eb
refactor: 테스트 코드 추가 및 코드 포맷 재적용
parksey Oct 30, 2023
9c10d45
refactor: 사용하지 않는 코드 제거
parksey Oct 30, 2023
92cb531
refactor: CRLF -> LF로 변경
parksey Oct 30, 2023
a7291a8
fix: config 커밋, config 최근 커밋으로 변경
parksey Oct 30, 2023
47ef3ea
feat: 테스트 코드 추가 및 패키지 구조 변경
parksey Oct 30, 2023
5a76a50
refactor: revert merge
parksey Oct 30, 2023
ab0063d
Merge branch 'develop' into feature/#5
parksey Oct 30, 2023
ab0b0ab
fix: merge confilt해결 및 예외처리 추가
parksey Oct 30, 2023
dff5e2e
test: oauth properties가 없을 때의 테스트코드 추가
parksey Oct 30, 2023
31407ab
feat: 코드리뷰에 따른 기능 분리 및 테스트 코드 변경
parksey Oct 31, 2023
448011e
fix: 테스트코드 관련 code smell 제거
parksey Oct 31, 2023
c421394
feat: Authorization grant 받기 예외 코드 및 테스트 코드 추가
parksey Nov 1, 2023
40cac6f
refactor: develop브랜치 merge
parksey Nov 1, 2023
36a64b1
feat: Authorization Token 요청 및 반환 코드, 에러 반환 테스트 코드 추가
parksey Nov 1, 2023
1eb8eb4
refactor: AuthenticationService에서 서버에 요청보내는 로직 OAuth2AuthorizationSer…
parksey Nov 1, 2023
5ef8308
test: 로그인 요청 테스트 코드 추가
parksey Nov 1, 2023
82925fa
feat: 토큰 발급 요청 기능 테스트 코드 추가 및 RestTemplate 필드변수로 변경
parksey Nov 1, 2023
95bea5d
refactor: develop 브랜치 merge
parksey Nov 1, 2023
7e53464
test: restTemplate 및 서비스 테스트 추가
parksey Nov 2, 2023
41b234b
refactor: 에러 메세지 이름 변경
parksey Nov 2, 2023
dffed00
refacotr: 변수명 및 entity default 명 변경
parksey Nov 2, 2023
5c32df9
feat: 토큰 정보 조회 기능 및 테스트 추가
parksey Nov 2, 2023
436dbdc
feat: 사용자 토큰 정보 조회 및 테스트 코드 & Resttemplate 테크트 코드 변경
parksey Nov 3, 2023
5b94df4
refactor: develop 브랜치 merge
parksey Nov 3, 2023
9995d28
Merge branch 'develop' of https://github.com/team-moabam/moabam-BE in…
parksey Nov 3, 2023
f58059b
fix: encoding, formatting, tab 문제로 인한 파일 삭제 후 다시 작성
parksey Nov 3, 2023
d1db0e4
feat: JWT 토큰 제공 서비스 및 테스트 코드 추가
parksey Nov 4, 2023
7862353
feat: 토큰 인증 코드 및 테스트 코드 작성
parksey Nov 4, 2023
dbf9488
feat: 로그인 및 회원가입 기능 추가
parksey Nov 5, 2023
5aa6cc0
feat: 회원 로그인 테스트 코드 추가
parksey Nov 6, 2023
cf030fc
chore: 코드 포메팅 재 설정
parksey Nov 6, 2023
f706306
Merge branch 'develop' of https://github.com/team-moabam/moabam-BE in…
parksey Nov 6, 2023
64d1609
refactor: develop 변경사항 merge
parksey Nov 6, 2023
672840e
feat: config 파일 업데이트
parksey Nov 6, 2023
0759ebb
refactor: develop 기능 merge
parksey Nov 6, 2023
9080613
fix: MemberServie confilt 해결
parksey Nov 6, 2023
00b1fe0
feat: Window용 포트 redis 포트 변경 추가
parksey Nov 7, 2023
42ddbd6
Merge branch 'develop' of https://github.com/team-moabam/moabam-BE in…
parksey Nov 7, 2023
4b00b42
refacotr: develop 업데이트 사항 merge
parksey Nov 7, 2023
b9b90f2
refactor: develop 업데이트 부분 merge
parksey Nov 7, 2023
3294470
fix: TimeConfig 삭제 및 코드 스멜 변경
parksey Nov 7, 2023
dafef37
refactor: 코르리뷰 반영
parksey Nov 7, 2023
66c441f
chore: submodule update
parksey Nov 7, 2023
7aa7292
refactor: develop 추가 기능 반영
parksey Nov 7, 2023
ded282f
feat: 메서드 파싱 customizing 및 @CurrentMember AuthorizationMember 를 파라미터로…
parksey Nov 7, 2023
66f56af
feat: 인가회원에 대한 객체 ThreadLocalMap에 저장하는 기능 추가
parksey Nov 7, 2023
91899f1
fix: 회원 정보 Optional 정보 조회 버그 fix, socialId requiredNotNull추가 등 에러 수정
parksey Nov 8, 2023
6b69352
feat: API요청 Path 및 인증에 따른 filter 추가
parksey Nov 11, 2023
fe34db0
test: CurrentMember 테스트 support 추가
parksey Nov 11, 2023
c1c921e
test: authorizationfilter 및 pathfilter 테스트 추가
parksey Nov 11, 2023
62a9369
test: 회원 repostiory 및 fixture 추가
parksey Nov 11, 2023
ff3cb3b
test: filter support 클랠스 추가
parksey Nov 11, 2023
1ab3913
test: filter support 클래스 적용
parksey Nov 11, 2023
cc929c0
refactor: develop 브랜치와 merge
parksey Nov 11, 2023
0df1440
refactor: PublicClaim 변환 책임 변경
parksey Nov 11, 2023
30225cb
test: PathResolver, CurrentMemberArgumentResovler테스트 코드 추가
parksey Nov 11, 2023
495938b
fix: 모든 쿠키 secure 적용되도록 변경
parksey Nov 11, 2023
3bfa398
refactor: 클래스 명 변경
parksey Nov 11, 2023
7922976
refactor: webConfig Path 매핑 클래스 추가
parksey Nov 13, 2023
e7f451f
refactor: develop 업데이트 merge
parksey Nov 13, 2023
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 @@ -9,14 +9,16 @@

import com.moabam.api.dto.AuthorizationCodeRequest;
import com.moabam.api.dto.AuthorizationCodeResponse;
import com.moabam.api.dto.AuthorizationMapper;
import com.moabam.api.dto.AuthorizationTokenInfoResponse;
import com.moabam.api.dto.AuthorizationTokenRequest;
import com.moabam.api.dto.AuthorizationTokenResponse;
import com.moabam.api.dto.LoginResponse;
import com.moabam.api.dto.OAuthMapper;
import com.moabam.api.dto.PublicClaim;
import com.moabam.global.common.util.CookieUtils;
import com.moabam.global.common.util.GlobalConstant;
import com.moabam.global.config.OAuthConfig;
import com.moabam.global.config.TokenConfig;
import com.moabam.global.error.exception.BadRequestException;
import com.moabam.global.error.model.ErrorMessage;

Expand All @@ -25,9 +27,10 @@

@Service
@RequiredArgsConstructor
public class AuthenticationService {
public class AuthorizationService {

private final OAuthConfig oAuthConfig;
private final TokenConfig tokenConfig;
private final OAuth2AuthorizationServerRequestService oauth2AuthorizationServerRequestService;
private final MemberService memberService;
private final JwtProviderService jwtProviderService;
Expand Down Expand Up @@ -55,13 +58,13 @@ public AuthorizationTokenInfoResponse requestTokenInfo(AuthorizationTokenRespons
public LoginResponse signUpOrLogin(HttpServletResponse httpServletResponse,
AuthorizationTokenInfoResponse authorizationTokenInfoResponse) {
LoginResponse loginResponse = memberService.login(authorizationTokenInfoResponse);
issueServiceToken(httpServletResponse, loginResponse.id());
issueServiceToken(httpServletResponse, loginResponse.publicClaim());

return loginResponse;
}

private String getAuthorizationCodeUri() {
AuthorizationCodeRequest authorizationCodeRequest = OAuthMapper.toAuthorizationCodeRequest(oAuthConfig);
AuthorizationCodeRequest authorizationCodeRequest = AuthorizationMapper.toAuthorizationCodeRequest(oAuthConfig);
return generateQueryParamsWith(authorizationCodeRequest);
}

Expand Down Expand Up @@ -91,7 +94,8 @@ private void validAuthorizationGrant(String code) {
}

private AuthorizationTokenResponse issueTokenToAuthorizationServer(String code) {
AuthorizationTokenRequest authorizationTokenRequest = OAuthMapper.toAuthorizationTokenRequest(oAuthConfig,
AuthorizationTokenRequest authorizationTokenRequest = AuthorizationMapper.toAuthorizationTokenRequest(
oAuthConfig,
code);
MultiValueMap<String, String> uriParams = generateTokenRequest(authorizationTokenRequest);
ResponseEntity<AuthorizationTokenResponse> authorizationTokenResponse =
Expand All @@ -115,9 +119,14 @@ private MultiValueMap<String, String> generateTokenRequest(AuthorizationTokenReq
return contents;
}

private void issueServiceToken(HttpServletResponse response, Long id) {
response.addHeader("token_type", "Bearer");
response.addCookie(CookieUtils.tokenCookie("access_token", jwtProviderService.provideAccessToken(id)));
response.addCookie(CookieUtils.tokenCookie("refresh_token", jwtProviderService.provideRefreshToken(id)));
public void issueServiceToken(HttpServletResponse response, PublicClaim publicClaim) {
response.addCookie(
CookieUtils.typeCookie("Bearer", tokenConfig.getRefreshExpire()));
response.addCookie(
CookieUtils.tokenCookie("access_token", jwtProviderService.provideAccessToken(publicClaim),
tokenConfig.getRefreshExpire()));
response.addCookie(
CookieUtils.tokenCookie("refresh_token", jwtProviderService.provideRefreshToken(),
tokenConfig.getRefreshExpire()));
Comment on lines +123 to +130
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Q: 매직넘버를 따로 안한 이유가 궁금합니다!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

관련 클래스 다 삭제!

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import org.json.JSONObject;
import org.springframework.stereotype.Service;

import com.moabam.api.dto.AuthorizationMapper;
import com.moabam.api.dto.PublicClaim;
import com.moabam.global.config.TokenConfig;
import com.moabam.global.error.exception.UnauthorizedException;
import com.moabam.global.error.model.ErrorMessage;
Expand All @@ -19,25 +21,25 @@ public class JwtAuthenticationService {

private final TokenConfig tokenConfig;

public boolean isTokenValid(String token) {
public boolean isTokenExpire(String token) {
try {
Jwts.parserBuilder()
.setSigningKey(tokenConfig.getKey())
.build()
.parseClaimsJwt(token);
return true;
} catch (ExpiredJwtException expiredJwtException) {
.parseClaimsJws(token);
return false;
} catch (ExpiredJwtException expiredJwtException) {
return true;
} catch (Exception exception) {
throw new UnauthorizedException(ErrorMessage.AUTHENTICATIE_FAIL);
throw new UnauthorizedException(ErrorMessage.AUTHENTICATE_FAIL);
}
}

public String parseEmail(String token) {
public PublicClaim parseClaim(String token) {
String claims = token.split("\\.")[1];
String decodeClaims = new String(Base64.getDecoder().decode(claims));
JSONObject jsonObject = new JSONObject(decodeClaims);

return (String)jsonObject.get("id");
return AuthorizationMapper.toPublicClaim(jsonObject);
}
}
28 changes: 20 additions & 8 deletions src/main/java/com/moabam/api/application/JwtProviderService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

import org.springframework.stereotype.Service;

import com.moabam.api.dto.PublicClaim;
import com.moabam.global.config.TokenConfig;

import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.RequiredArgsConstructor;
Expand All @@ -16,15 +18,27 @@ public class JwtProviderService {

private final TokenConfig tokenConfig;

public String provideAccessToken(long id) {
return generateToken(id, tokenConfig.getAccessExpire());
public String provideAccessToken(PublicClaim publicClaim) {
return generateIdToken(publicClaim, tokenConfig.getAccessExpire());
}

public String provideRefreshToken(long id) {
return generateToken(id, tokenConfig.getRefreshExpire());
public String provideRefreshToken() {
return generateCommonInfo(tokenConfig.getRefreshExpire());
Comment on lines +21 to +26
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Q: 하나의 메서드에서 하나의 메서드를 호출하는 것 같은데, 메서드를 한 번 더 감싼 이유가 있나요?

}

private String generateToken(long id, long expireTime) {
private String generateIdToken(PublicClaim publicClaim, long expireTime) {
return commonInfo(expireTime)
.claim("id", publicClaim.id())
.claim("nickname", publicClaim.nickname())
.claim("role", publicClaim.role())
.compact();
}

private String generateCommonInfo(long expireTime) {
return commonInfo(expireTime).compact();
}

Comment on lines +29 to +40
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C: 이를 그대로 사용하면 되지 않나? 생각이 듭니다!

private JwtBuilder commonInfo(long expireTime) {
Date issueDate = new Date();
Date expireDate = new Date(issueDate.getTime() + expireTime);

Expand All @@ -34,8 +48,6 @@ private String generateToken(long id, long expireTime) {
.setIssuer(tokenConfig.getIss())
.setIssuedAt(issueDate)
.setExpiration(expireDate)
.claim("id", id)
.signWith(tokenConfig.getKey(), SignatureAlgorithm.HS256)
.compact();
.signWith(tokenConfig.getKey(), SignatureAlgorithm.HS256);
}
}
6 changes: 2 additions & 4 deletions src/main/java/com/moabam/api/application/MemberService.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import com.moabam.api.domain.entity.Member;
import com.moabam.api.domain.repository.MemberRepository;
import com.moabam.api.domain.repository.MemberSearchRepository;
import com.moabam.api.domain.repository.NotificationRepository;
import com.moabam.api.dto.AuthorizationTokenInfoResponse;
import com.moabam.api.dto.LoginResponse;
import com.moabam.api.dto.MemberMapper;
Expand All @@ -28,7 +27,6 @@ public class MemberService {

private final MemberRepository memberRepository;
private final MemberSearchRepository memberSearchRepository;
private final NotificationRepository notificationRepository;

public Member getById(Long memberId) {
return memberRepository.findById(memberId)
Expand All @@ -38,9 +36,9 @@ public Member getById(Long memberId) {
@Transactional
public LoginResponse login(AuthorizationTokenInfoResponse authorizationTokenInfoResponse) {
Optional<Member> member = memberRepository.findBySocialId(authorizationTokenInfoResponse.id());
Member loginMember = member.orElse(signUp(authorizationTokenInfoResponse.id()));
Member loginMember = member.orElseGet(() -> signUp(authorizationTokenInfoResponse.id()));

return MemberMapper.toLoginResponse(loginMember.getId(), member.isEmpty());
return MemberMapper.toLoginResponse(loginMember, member.isEmpty());
}

private Member signUp(Long socialId) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/moabam/api/domain/entity/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public class Member extends BaseTimeEntity {
@Builder
private Member(Long id, Long socialId, String nickname, Bug bug) {
this.id = id;
this.socialId = socialId;
this.socialId = requireNonNull(socialId);
this.nickname = requireNonNull(nickname);
this.profileImage = BaseImageUrl.PROFILE_URL;
this.bug = requireNonNull(bug);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.moabam.api.dto;

import org.json.JSONObject;

import com.moabam.api.domain.entity.enums.Role;
import com.moabam.global.config.OAuthConfig;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class OAuthMapper {
public final class AuthorizationMapper {

public static AuthorizationCodeRequest toAuthorizationCodeRequest(OAuthConfig oAuthConfig) {
return AuthorizationCodeRequest.builder()
Expand All @@ -25,4 +28,16 @@ public static AuthorizationTokenRequest toAuthorizationTokenRequest(OAuthConfig
.clientSecret(oAuthConfig.client().clientSecret())
.build();
}

public static PublicClaim toPublicClaim(JSONObject jsonObject) {
return PublicClaim.builder()
.id(Long.valueOf(jsonObject.get("id").toString()))
.nickname(jsonObject.getString("nickname"))
.role(jsonObject.getEnum(Role.class, "role"))
.build();
}

public static AuthorizationMember toAuthorizationMember(PublicClaim publicClaim) {
return new AuthorizationMember(publicClaim.id(), publicClaim.nickname(), publicClaim.role());
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/moabam/api/dto/AuthorizationMember.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.moabam.api.dto;

import com.moabam.api.domain.entity.enums.Role;

public record AuthorizationMember(
Long id,
String nickname,
Role role
) {

}
6 changes: 4 additions & 2 deletions src/main/java/com/moabam/api/dto/LoginResponse.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.moabam.api.dto;

import com.fasterxml.jackson.annotation.JsonUnwrapped;

import lombok.Builder;

@Builder
public record LoginResponse(
Long id,
boolean isSignUp
boolean isSignUp,
@JsonUnwrapped PublicClaim publicClaim
) {

}
14 changes: 6 additions & 8 deletions src/main/java/com/moabam/api/dto/MemberMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,13 @@ public static Member toMember(Long socialId, String nickName) {
.build();
}

public static LoginResponse toLoginResponse(Long memberId) {
public static LoginResponse toLoginResponse(Member member, boolean isSignUp) {
return LoginResponse.builder()
.id(memberId)
.build();
}

public static LoginResponse toLoginResponse(Long memberId, boolean isSignUp) {
return LoginResponse.builder()
.id(memberId)
.publicClaim(PublicClaim.builder()
.id(member.getId())
.nickname(member.getNickname())
.role(member.getRole())
.build())
.isSignUp(isSignUp)
.build();
}
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/com/moabam/api/dto/PublicClaim.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.moabam.api.dto;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.moabam.api.domain.entity.enums.Role;

import lombok.Builder;

@Builder
public record PublicClaim(
Long id,
@JsonIgnore String nickname,
@JsonIgnore Role role
) {

}
12 changes: 6 additions & 6 deletions src/main/java/com/moabam/api/presentation/MemberController.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.moabam.api.application.AuthenticationService;
import com.moabam.api.application.AuthorizationService;
import com.moabam.api.dto.AuthorizationCodeResponse;
import com.moabam.api.dto.AuthorizationTokenInfoResponse;
import com.moabam.api.dto.AuthorizationTokenResponse;
Expand All @@ -21,21 +21,21 @@
@RequiredArgsConstructor
public class MemberController {

private final AuthenticationService authenticationService;
private final AuthorizationService authorizationService;

@GetMapping
public void socialLogin(HttpServletResponse httpServletResponse) {
authenticationService.redirectToLoginPage(httpServletResponse);
authorizationService.redirectToLoginPage(httpServletResponse);
}

@GetMapping("/login/kakao/oauth")
@ResponseStatus(HttpStatus.OK)
public LoginResponse authorizationTokenIssue(@ModelAttribute AuthorizationCodeResponse authorizationCodeResponse,
HttpServletResponse httpServletResponse) {
AuthorizationTokenResponse tokenResponse = authenticationService.requestToken(authorizationCodeResponse);
AuthorizationTokenResponse tokenResponse = authorizationService.requestToken(authorizationCodeResponse);
AuthorizationTokenInfoResponse authorizationTokenInfoResponse =
authenticationService.requestTokenInfo(tokenResponse);
authorizationService.requestTokenInfo(tokenResponse);

return authenticationService.signUpOrLogin(httpServletResponse, authorizationTokenInfoResponse);
return authorizationService.signUpOrLogin(httpServletResponse, authorizationTokenInfoResponse);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.moabam.global.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentMember {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.moabam.global.common.handler;

import static com.moabam.global.common.util.AuthorizationThreadLocal.*;

import java.util.Objects;

import javax.annotation.Nullable;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import com.moabam.api.dto.AuthorizationMember;
import com.moabam.global.common.annotation.CurrentMember;

public class CurrentMemberArgumentResolver implements HandlerMethodArgumentResolver {

@Override
public boolean supportsParameter(MethodParameter parameter) {
return Objects.nonNull(parameter.getParameterAnnotation(CurrentMember.class))
&& parameter.getParameterType().equals(AuthorizationMember.class);
}

@Override
public Object resolveArgument(@Nullable MethodParameter parameter, ModelAndViewContainer mavContainer,
@Nullable NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
return getAuthorizationMember();
}
}
Loading