OAuth - GitHub 로그인2

bongf·2021년 4월 27일
2

Learned

목록 보기
1/3
post-thumbnail

1. 프로젝트 세팅

(1-1) DB세팅 오류

  • web / jdbc / devtools 빌드해서 실행하면 항상

    Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

  • 이런 에러가 난다. 이것은 JDBC를 썼기 때문에 DB를 연동해줘야하는 것으로 생각된다.

      1. DB 세팅 해주고(도커 실행)
      1. runtimeOnly 'mysql:mysql-connector-java' 의존성 추가
      1. application.properties에 DB 정보 추가
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=
spring.datasource.password=
logging.level.sql=debug

(1-2) url 매핑 오류

  • 아무리 해도 설정한 url이 매핑 되지 않았다.
  • 이유는 controller 패키지가 기본 설정한 com.bongf.oauthPractice 패키지 밖에 있었기 때문에 발생한 문제
    • 이렇게 @SpringBootApplication 이 붙은 이 클래스랑 같은 패키지 안에 있는 것들만 bean으로 등록을 해준다고 K교수님이 알려주셨다.

(1-3) 추가로 알게 된 것

(1-3-1) RestController로 해두면 return하는 String을 그대로 화면에 보여준다.

@RestController
public class OauthController {
...
	@GetMapping("/login/oauth2/code/github")
    public String code(String code) {
    	...
        return "hello"
    }
}
  • 결과값

(1-3-2) 파라미터로 넘어 오는 것들에 대해 @PathVariable 을 사용하지 않아도 된다.

  • http://localhost:8080/login/oauth2/code/github?code=xxx 이런식으로 code 값이 넘어오는 상황에서 이를 받고 싶었다.
  • 처음에는 이런식으로 code를 작성했으나
  • 이렇게 제거 했을 때에도 똑같이 작동했다.

(1-3-3) 롬복

  • 롬복은 getter, setter에 대한 편의성을 제공할 뿐 어렵게 생각하지 말자

2. 공개하고 싶지 않은 정보를 application.properties 활용하기

  • application.properties 파일을 쪼개서 사용할 수 있다
  • git에 공유하고 싶지 않은 정보들을 따로 파일을 쪼개서 정보를 저장하고 해당 파일을 git이 추적하지 않게 해줬다.

(2-1) properties 파일 쪼개기

 git rm --cached 파일명
  • modified까지 된 상황이어서 삭제 실패. 강제 삭제할 수 있는 명령어를 입력했다.
git rm --cached -f 파일명
  • git status로 찍어보니 해당 파일이 더이상 트래킹 되고 있지 않았다.

(2-2) 해당 정보 활용하기

  • 이렇게 Envrionment를 선언하고 생성자 주입을 해준다.
  • 이런식으로 활용 가능하다

3. GitHub 로그인 구현하기

3.1 사용자가 로그인 버튼을 눌렀을 때 깃헙 로그인하도록 만들기

  • 이 주소로 GET요청을 하면 authorization 코드를 받을 수 있다.
  • 사용자가 로그인 버튼을 누르면 이 주소로 이동할 수 있도록 만들었다.
    • index.html에 간단하게 해당 링크로 이동할 수 있게 했다.

3.2 코드 받아오기

  • 성공적으로 깃헙 로그인 하면 code를 포함한 url로(우리가 설정한 콜백 url) 자동으로 리다이렉트 된다.
  • 이를 받아줄 수 있게 컨트롤러에서 매핑을 해준다.
    • code 값이 제대로 들어올 것이다

3.3. 토큰 요청하기

  • 이런 POST요청을 하라고 나와있다.
  • 스프링부트에서 이런 요청을 하기 위해 RestTemplate을 사용했다.
  • 우선 HttpEntity를 만들어줬다.
    • redirect_url은 클래스에 상수로 선언해줬다.
    • 그래도 답변을 json으로 받고 싶으면 헤더에 이렇게 포함하라고 가이드가 있어서 헤더에 위 내용도 포함해줬다.
    • 이 블로그에 HashMap이 아니라 MultiValueMap을 써야 하는 이유가 나와있다. https://javaiyagi.tistory.com/457
  • RestTemplate으로 요청을 보내고 응답을 받아왔다.
  • 스트링으로 응답을 받아와서 OAuthToken이라는 객체를 만들어 매핑해줬다.
package com.bongf.oauthPractice;

import com.fasterxml.jackson.annotation.JsonProperty;

public class OAuthToken {
    private String accesToken;
    private String tokenType;
    private String scope;
    private String bearer;

    @JsonProperty("access_token")
    public void setAccesToken(String accesToken) {
        this.accesToken = accesToken;
    }

    @JsonProperty("token_type")
    public void setTokenType(String tokenType) {
        this.tokenType = tokenType;
    }

    public void setScope(String scope) {
        this.scope = scope;
    }

    public void setBearer(String bearer) {
        this.bearer = bearer;
    }

    public String getAccesToken() {
        return accesToken;
    }

    public String getTokenType() {
        return tokenType;
    }

    public String getScope() {
        return scope;
    }

    public String getBearer() {
        return bearer;
    }
}

4. GitHub 프로필 요청하기

  • 깃헙 요구사항
  • 요구사항대로 HttpEntity를 만들어줬다.
  • 그리고 RestTemplate을 이용해서 요청을 날리고 응답을 GitHubProfile을 만들어 이에 매핑해줬다.

5. 리팩토링

5-1. ObjetMapper 대신 객체로 바로 받기

  • ObjetMapper를 사용하면 readVlaue()를 할 때 JsonProcessingException을 throw해줘야 한다.
  • 객체로 바로 받은 다음에 getBody()를 해줘도 똑같이 작동한다

5-2. redirect url 삭제

  • GitHub docs에서 redirect url 부분을 optional 이라고 나와있다. (application에 등록되어 있으니 상관 없는 듯하다)

  • 해당 부분을 지워줘도 똑같이 작동한다

5-3. HttpEntity 대신 RequestEntity 사용하기

  • 이렇게 MultiValueMap을 만들어서 HtttpEntity를 RestTemplate에서 활용해주는 방식과 RequestEntity를 사용하는 방식이 있다. 공식문서
    • RequestEntity는 HttpEntity를 상속받는다
  • 이 블로그보면 MultiValueMap를 사용하는 이유는 같은 key값에 여러 값을 넣을 때 사용한다고 나와있다. (name="홍길동"&name="김철수" 하면 name에 {"홍길동", "김철수"}가 들어간다.
  • 지금 상황에서는 그럴 필요가 없기 때문에 RequestEntity를 사용해본다.
  • 생성자 주입은 빈에 등록된 것들만 사용가능하니까 contorller에서 environment를 넣어주고 이를 requust DTO를 생성할 때 매개변수로 넣어준다 requestdto도 만들어 줬다. 확인해보니 정상적으로 동작한다
  • K교수님 코드를 보고 responseEntity가 더욱 깔끔해 보여 ResponseEntity로 만들어준다
  • docs 가이드
  • 이렇게 변경해주니 정상동작한다. 훨씬 깔끔하다.

6. 구현모습

  • 깃헙 로그인을 했을 때 세션에 해당 token을 담아줬다.
  • /start(start링크클릭) 을 했을 때 세션에서 token 값이 없으면 "로그인이필요"하다는 string을 반환하고 로그인한 유저면 "스타트"를 출력해준다.


7. 공부할 것

  • 리프레시 토큰 관련
  • RestTemplate과 WebClient

8. 깃헙링크

https://github.com/bong6981/OAuthStudy

profile
spring, java학습

0개의 댓글