[최종 완성본]
[진행 순서]
네이버 아이콘 클릭 -> 네이버 로그인 창 -> 로그인하는 순간 -> 요청 값들을 가지고 -> redirect 페이지로 이동 -> Access Token 발급 -> 토큰을 이용해서 사용자 정보 가져오기 -> 사용자 정보가 DB에 있는지 확인 -> 없다면 회원가입 -> 있다면 자동 로그인
[네이버 아이콘 클릭]
@click 이벤트를 만들어 놓고 아래의 method 실행
<img class="naverIdLogin" :src="require('@/assets/image/naverlogin.jpg')" @click="naverlogin" />
@click="naverlogin" 메서드
naverlogin() {
let client_id = "본인 client_id"
let redirect_uri = encodeURIComponent("redirct_url", "UTF-8")
const state = this.generateRandomState()
const apiURL = "https://nid.naver.com/oauth2.0/authorize?response_type=code"
+ "&client_id=" + client_id
+ "&redirect_uri=" + redirect_uri
+ "&state=" + state
window.location.href = apiURL
},
네이버에 로그인 인증요청 문서를 살펴보면 필수 여부(Y)로 아래의 4개의 값들을 가져간다. 따라서 const apiURL을 보면 response_type=code로 첫 번째 요청 & client_id & redirect_uri & state를 보냈다.
문서에 나와 있는 것 처럼 state는 사이트 간 요청 위조를 위해 사용하는 것이라고 나와 있다. 따라서 나는 state를 String 형태로 난수를 생성해서 함께 보낼 것이다.
아래 난수 코드를 조금 자세한 설명을 원하면 아래의 링크로...
자바, 자바스크립트 난수 생성 코드
파이널 프로젝트로 네이버 로그인을 구현 하던 중 16자리의 난수 생성이 필요 했다. 난수를 생성하는건 여러 방법이 있어 그 중에 두가지 방법을 소개 해보려고 한당 [Java] Random random = new Random();
henniee.tistory.com
// state 난수 생성
generateRandomState() {
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let state = "";
for (let i = 0; i < 16; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
state += characters.charAt(randomIndex);
}
return state;
}
}
이렇게 담아 갈 것들을 담아가서 redirect_uri 페이지로 가보자
[naverjoin.vue]
페이지가 시작되자마자 code 와 state를 가지고 Token을 발급하러 간다
created() {
this.code = this.$route.query.code;
this.state = this.$route.query.state;
console.log(this.code)
console.log(this.state)
this.getToken(this.code, this.state);
}
[getToken 메서드]
getToken() {
const self = this;
let formData = new FormData();
formData.append('code', self.code);
formData.append('state', self.state);
self.$axios.post('http://localhost:8181/api/naver/login', formData)
.then((res) => {
if(res.status==200){
if(res.data.userinfo.message){
alert(res.data.userinfo.message);
location.href = "/"
} else {
console.log(res.data);
self.form.email = res.data.userinfo.naverResponse.email;
self.form.pwd = res.data.userinfo.naverResponse.id;
self.form.nickname = res.data.userinfo.naverResponse.nickname;
self.form.navertoken = res.data.access_token;
}
self.$axios.get('http://localhost:8181/members/getSnsMember/' + self.form.email)
.then(function (res) {
if (res.status == 200) {
console.log(res.data.flag);
if (res.data.flag == false) {
console.log(res.data.flag);
} else {
self.Nlogin();
// Nlogin()메서드는 로그인 메서드와 동일하게 구현
}
}
});
}
});
},
첫번째 $axios는 Access Token을 받으려는 비동기 요청이고 두 번째 $axios는 Access Token 으로 받아온 사용자의 정보가 DB에 저장되어 있나 중복 검사를 하는 요청이다.
아래의 3탄에서 서버 단의 코드를 구현 해보겠다.
[REST API] 네이버 로그인 구현하기 (3) - Java 코드
2탄에서 vue의 전체적인 코드를 살펴보았다. vue에서 구현 한 것을 전체적으로 써보자면 네이버 로그인 이미지 버튼 클릭 -> naver 로그인 api 주소 호출 (여기에 클라이언트 아이디와 리다이렉트 주
henniee.tistory.com
'프로젝트 > Plan + tiful (플랜티플)' 카테고리의 다른 글
[Rest API] 자바 실제 계좌 예금주 확인 feat. 계좌실명조회 - (2) 최종코드 (0) | 2023.08.02 |
---|---|
[Rest API] 자바 실제 계좌 예금주 확인 feat. 계좌실명조회 - (1) (1) | 2023.07.28 |
[Rest Api] 네이버 로그인 구현하기 (1) - vue.js (0) | 2023.07.23 |
[Rest Api] 포트원 API를 이용한 본인인증 구현 (feat. vue.js) - (3) (0) | 2023.07.22 |
[Rest Api] 포트원 API를 이용한 본인인증 구현 (feat. vue.js) - (2) (0) | 2023.07.21 |