최근에 페이스북 앱을 새로 만드셨다면 로그인 설정 -> 클라이언트 OAuth 설정 부분에서 HTTPS 적용이 강제로 "예"로 설정이 되어있습니다. 그래서 로컬에서 작업하시더라도 인증서를 생성하셔야 합니다.
또한, 리디렉션 URI에 Strict 모드 사용이 강제로 "예"로 설정되어 있기 때문에 "유효한 OAuth 리디렉션 URI" 설정 부분에 반드시 정확한 callbackURL을 등록해주셔야 합니다. 이 강의에서는 https://<도메인 주소>/auth/facebook/callback을 등록해주시면 됩니다.
* 주의사항
Create the root pair, Create the intermediate pair 에 openssl.cnf 라는 설정파일이 있는데
두 개의 설정파일에 추가해야 할 사항이 있습니다.
[ v3_ca ], [ v3_intermediate_ca ], [ server_cert ] 부분에
아래 두 줄을 추가해줍니다.
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
또한, 독립적으로, 아래 코드를 추가합니다.
----------------------------------------
[alt_names]
DNS.1 = http://www.example.com
DNS.2 = example.com
----------------------------------------
위 주의사항을 지키지 않으시면, 크롬 개발자 콘솔의 security 탭 부분에 에러가 뜰 겁니다.
에러내용은 결국 인증서에 "Subject Alternative Name" 항목이 없다는 겁니다.
"View certificate"을 해서 details를 보시면 없을 겁니다.
이렇게 하시면 인증서가 생성이 될 것이고 필요한 파일은 아래와 같습니다.
-----------------------------------------
ca-chain.cert.pem http://www.example.com.key.pem http://www.example.com.cert.pem
-----------------------------------------
생성된 3개의 파일을 server_side_javascript에 ssl이라는 폴더를 생성하고 그리로 복사하세요.
권한 때문에 복사가 제대로 되지 않으시면 커맨드창에서 cp 명령어로 복사해옵니다.
2. 크롬 브라우저에 인증서 등록하기
크롬 브라우저 settings -> Advanced를 들어가시면 "Manage certificates"를 클릭하세요.
"AUTORITIES"탭을 클릭하시면 import로 인증서를 등록하실수 있습니다.
반드시 "ca-chain.cert.pem" 파일을 등록하세요. 왜냐면 root certificate, intermediate certificate, server certificate 이 체인으로 묶여서 한꺼번에 등록이 되기 때문입니다.
3. app_passport_file.js 에 생성한 인증서 읽어오는 코드 추가하기
파일 상단에 아래 코드를 추가하세요.
------------------------------------------
var fs = require('fs');
var https = require('https');
------------------------------------------
파일 맨 아래에 아래 코드를 추가하세요.
-----------------------------------------------------------------------
var options = {
ca: fs.readFileSync('ssl/ca-chain.cert.pem'),
key: fs.readFileSync('ssl/www.example.com.key.pem'),
cert: fs.readFileSync('ssl/www.example.com.cert.pem'),
passphrase: 'secretpassword'
};
https.createServer(options, app).listen(443, () => {
console.log('Connected 443 port !');
});
---------------------------------------------------------------------
* 주의사항
passphrase 속성에 여러분이 인증서를 생성할 때 설정한 비밀번호를 입력해주셔야 합니다.
개개인마다 생성할때 비밀번호를 다르게 설정할 수 있으므로 주의하세요.
만약, 인증서 생성하실때 해당 링크 튜토리얼을 그대로 따라하셨다면
위와 같이 passphrase는 secretpassword가 됩니다.
4. 로컬호스트 IP에 도메인 연결하기
커맨드 창을 열고 sudo vim /etc/hosts 파일을 여시고,
아래 코드를 맨 아래에 추가하세요.
------------------------------------------
127.0.0.1 http://www.example.com
------------------------------------------
* 주의사항
만약 인증서 생성시 Common Name에 도메인 주소를
다르게 생성하셧다면 Common Name과 일치하는 주소로
host를 등록해주셔야 합니다.
위의 모든 과정을 따라하셨다면,
아마 페이스북 API에 잘 접속이 되실 겁니다.
마지막으로 반드시 페이스북 앱의 로그인 설정에서
"유효한 OAuth 리디렉션 URI" 에
https://<도메인 주소>/auth/facebook/callback
을 등록해주시는걸 까먹지 마세요.
이 부분 때문에 몇일을 삽질했습니다.
그리고 앱 설정 -> 기본설정에서 "앱 도메인", "사이트 URL", "개인정보처리방침 URL" 에 모두
host에 등록된 도메인 주소를 입력해주세요.
또한, 앱 설정 -> 고급설정에 "앱 시크릿 코드 요청"을 "아니요"로 해주시고,
리디렉션 공유 화이트리스트에서 "도메인 간 공유 리디렉션 허용"을 "예"로
해주시면 아마 잘 되리라고 생각이 됩니다.
지금 페이스북에서 개인정보 유출 문제로 developer에서 앱 설정이 모두 비활성화 되었네요.
제가 따로 확인하기는 힘들지만 말씀하신 부분을 보면 https가 필요하다는 내용으로 봐서
아마 상단 설정 중 enforce https를 체크하신게 아닌가 싶습니다.
그걸 해제하면 http도 입력 할 수 있습니다.
제 Developers 페이지가 영문으로 되어있어서..
Facebook Login - Settings - Valid OAuth Redirect URIS 에 http://localhost:3003/ 을 입력하고 enter를 입력하면,
HTTPS is required for all Redirect URIs 라는 풍선과 함께 빨간색 x 표가 입력됩니다.
그리고 새로고침을 하게 되면 입력된 내용이 모두 지워지는데, 별도의 저장 방법이 있나요? 저장하기 같은 아이콘이나 버튼이 따로 보이지는 않아서요.
저도 같은에러로 헤매고 있는데요...유효한 OAuth 리디렉선에 이거넣고 ==> http://localhost......ack 로 설정한뒤 변경내용 저장 ==> 새로고침 ==> https://localhost......ck.. https로 자동변경?이 되네요 ;; ㅠㅠ //// 결국 https서비스를 제공할 수 있도록 openSSL 설정을 새로해서 해결했습니다~ ;;
저도 유효한 URI를 추가하라고 하네요.. 아래 알려주신 방법 다 안되네요 ㅠㅠ
페이스북에서 URI 리디렉션 유효성 검사 시도해도 http://localhost......ok, login 등 이런 주소가 다 유효하지않은 주소라고 뜨네요
하루동안 이것저것 해보다가 해결했습니다.
앱 대시보드에서 좌측 네비게이션에서 페이스북로그인의 설정에 들어가세요
거기서 유효한 OAuth 리디렉선 URI에 http://localhost......을 넣고
저장해주세요.상단 설정 중 Enforce https만 빼고 다 예로 하시면 됩니다.
이러면 로그인이 가능하네요.
안녕하세요 강의를 접하고 마지막에 페이스북으로 로그인이 넘어가는 와중에
"차단된 URL: 리디렉션 URI가 앱의 클라이언트 OAuth 설정의 화이트리스트에 없으므로 리디렉션하지 못했습니다. 클라이언트 및 웹 OAuth 로그인이 설정되었는지 확인하고 모든 앱 도메인을 유효한 OAuth 리디렉션 URI로 추가하세요."
이런 에러를 접해서 아래 적어주신분의 방법도 써보고 인터넷에서 찾아보기도 했는데 어떤 방법으로도 넘어가지질 않습니다 ㅠㅠㅠ 답변 부탁드려요!!
이고잉님 강의에서와 같이 로그인을 하였을때 바로 로그인 된 welcome 페이지로 가지 않고 로그인되지 않은 welcome페이지로 가는 경우가 종종 발생하더라고요.
마지막 강의 8분 30초 쯤 터미널 실행화면이 나오는데 그때와 마찬가지로 passport.serializeUser()만 실행되고 deserializeUser는 실행되지 않는 것을 볼 수 있는데 왜 이런 현상이 발생하는 걸까요?
혹시 해결책을 아시는 분이 계신가요?
"URL을 읽어들일 수 없음: 앱 도메인에 포함되어 있지 않은 URL입니다. 이 URL을 읽어들이려면 앱 설정에서 앱 도메인 필드에 앱의 모든 도메인과 서브 도메인을 추가하세요." 이 에러가 나타난다면 아래의 링크에 들어가서 해결하세요. https://jwkcp.github.io......de/
그리고 또한 똑같이 했음에도 email의 정보가 주어지지 않습니다..!! email이라는 항목이 아예 console에 나타나지도 않구요! stackoverflow등 모든 곳을 뒤져봤지만 이고잉님과 같은 코드이며 저는 실행이 되지 않네요 ㅠㅠ
그리고 scope를 추가했을때 다시 로그인을 할때 한번 더 사용자가 허용하는 창도 뜨지가 않습니다.! 이것은 계정의 문제인가요??
안녕하세요 이고잉님~ 답변이 절실합니다!! ㅜㅜ다름이 아니라 인증 수업을 들으면서 이전 local에서도 그렇고 이번 통합인증 수업에서도 그렇고
그냥 successRedirect:'/welcome'을 해주면 로그인 성공 후 이름이 출력이 되지 않는데.
successRedirect : '/welcome'부분을 주석처리 하고 passport.authenticate 미들웨어 뒤에 callback함수로 function(req, res){
req.session.save(function(){
res.redirect('/welcome');
});
}
이런식으로 session을 save한 후에 redirect해주면 정상적으로 이름이 출력이 됩니다! 이고잉님의 코드에서는 이러한 과정을 해주지 않아도 실행이 되던데 차이점이 무엇인가요?