복습 - MONGODB AND MONGOOSE
복습 - USER AUTHENTICATION
실제 코드는 github에 올림(wetube_v2)
💡 해시태그 포맷
- 방법 1 (pre hook 이용)
DB update 시에는 사용 못 함// Video.js videoSchema.pre("save", async function () { // form에서 받아온 hashtags가 아니라 schema의 hashtags라서 문자열 아니고 배열 형태 ❗ this.hashtags = await this.hashtags[0] .split(",") .map((word) => (word.startsWith("#") ? word : `#${word}`)); });
- 방법 2 (formatHashtags 함수 export & import)
// Video.js export const formatHashtags = (hashtags) => hashtags.split(",").map((word) => (word.startsWith("#") ? word : `#${word}`));
// videoController.js import Video, { formatHashtags } from "../models/Video"; export const postEdit = async (req, res) => { // 중략 await Video.findByIdAndUpdate(id, { title, description, hashtags: formatHashtags(hashtags), }); // 중략 };
- 방법3 (query 직접 만들기)
// Video.js videoSchema.static("formatHashtags", function(hashtags) { return hashtags.split(",").map((word) => (word.startsWith("#") ? word : `#${word}`)); })
// videoController.js export const postEdit = async (req, res) => { // 중략 await Video.findByIdAndUpdate(id, { title, description, hashtags: Video.formatHashtags(hashtags), }); // 중략 };
💡 github 로그인 순서
[ startGithubLogin ]
github 로그인 링크 클릭
http:// localhost:7000/users/github/start
https:// github.com/login/oauth/authorize?client_id=...[ finishGithubLogin ]
user가 앱으로 하여금 github user 정보에 접근할 수 있도록 권한을 승인해줌
http:// localhost:7000/users/github/finish?code=... (redirect)https:// github.com/login/oauth/access_token?client_id... (fetch 이용)
code를 access token으로 바꿈https:// api.github.com/user (fetch 이용)
github api에 접근해서 user data와 user email 정보를 가져옴primary & verified email을 찾음
github email이 DB에 있다면 login 시킴
github email이 DB에 없다면, 그 user의 계정을 생성함
💡 github email이 DB에 없다면, 그 user의 계정을 생성한다
이때 (비록 userSchema에서 password가 필수 값이 아니더라도) User.create({ })에는password: ""
도 적어줘야 한다.
패스워드를 해싱하는 bcrypt가 password 값을 필요로 하기 때문이다.
이 경우 빈 문자열을 해싱하여 DB에 저장하게 된다.대신, github 정보를 이용해 계정 생성을 위해 User.create({ })를 실행할 때 password 필드는 아예 쓰지 말고, 패스워드를 해싱하는 pre hook에
if (!this.socialOnly && this.isModified("password"))
를 추가할 수도 있다. [TIL] 211226 참고