이전에 Gmail API를 통해 메일 발송하는 것까지 구현하였다. 그러면 메일에서 어떻게 사용자 인증을 할 수 있을까?라는 생각을 가지게 되었다.
아이디어는 악보공장이라는 사이트에서 힌트를 얻었다.
패스워드 변경하기 url을 확인해봤는데 userID와 code가 get방식으로 호출하는 것을 볼 수 있다. 이것을 프로젝트에 적용해보았다.
로직을 다이어그램으로 나타내 보았다.
코드로 알아보자
randomBytes변수에는 'hex'로 이루어진 20자리 해시값이 저장된다. 그리고 mailOptions을 보게 되면 해시값과 userID가 url에 포함되는 것을 볼 수 있다.
DB에 생성한 토큰(해시값)과 현재시간 + 1(유효시간 1분)이 DB안에 저장된다. 이 말은 즉슨 1분 안에 링크를 클릭하여 비밀번호를 변경해야 한다는 의미이다.
GET방식으로 전달받은 param을 가지고 checkToken API를 호출한다.
userID와 userEmailCode가 같은 것이 있는지 확인하고 더 나아가 userEmailTime이 1분 이전인 것을 확인한다. 즉 rows.length === 0(select된 것이 없음)면 유효하지 않은 것이고 rows.legnth === 1(select된 것이 있음) 유효한 것이다.
좋은 글 감사합니다 :)