programing

passport.js RESTful 인증

muds 2023. 7. 30. 18:08
반응형

passport.js RESTful 인증

웹 인터페이스 대신 RESTful API를 통해 passport.js를 사용한 인증(예: 로컬 및 Facebook)을 어떻게 처리합니까?

특정 문제는 일반적인 res.send({data:req.data})를 사용하여 콜백에서 RESTful 응답(JSON)으로 데이터를 전달하는 것과 비교하여 Facebook으로 리디렉션하는 초기 /login 끝점을 설정하는 것입니다(/JSON 응답이 아니므로 AJAX를 통해 액세스할 수 없음).

저는 https://github.com/halrobertson/test-restify-passport-facebook, 을 찾았지만 이해하는 데 어려움을 겪고 있습니다.

또한 passport.js는 인증 정보를 어떻게 저장합니까?서버(또는 서비스입니까?)는 MongoDB에서 지원하며 자격 증명(로그인 및 pw의 salted hash)이 저장될 것으로 예상되지만 passport.js에 이러한 기능이 있는지 모르겠습니다.

여기에는 많은 질문이 있으며, Node와 passport.js의 맥락에서 질문을 받더라도 실제 질문은 특정 기술로 이를 수행하는 방법보다는 워크플로우에 관한 것으로 보입니다.

보안을 강화하기 위해 약간 수정된 @Keith 예제 설정을 사용합니다.

  • 위치:https://example.com 클라이언트 합니다.
  • RESTful 웹 웹 :https://example.com/api 클라이언트
  • 서버가 노드 및 passport.js에 구현되었습니다.
  • 서버에는 "사용자" 테이블이 있는 데이터베이스(모든 종류)가 있습니다.
  • 사용자 이름/암호 및 Facebook Connect가 인증 옵션으로 제공됩니다.
  • 을 REST로 만듭니다.https://example.com/api
  • 전화 앱가 있을 수 . 웹 서비스를 참조하십시오.https://example.com/api 웹 는 잘 모릅니다.https://example.com.

보안 HTTP를 사용하고 있습니다.비밀번호 및 인증 토큰과 같은 중요한 정보가 클라이언트와 서버 간에 전달되기 때문에 이는 공개된 모든 서비스에서 필수적인 사항이라고 생각합니다.

사용자 이름/암호 인증

먼저 일반 기존 인증이 어떻게 작동하는지 살펴보겠습니다.

  • 가 사자가는위에 합니다.https://example.com
  • 서버는 초기 페이지를 렌더링하는 풍부한 Javascript 응용프로그램을 제공합니다.페이지에 로그인 양식이 있습니다.
  • 이 단일 페이지 앱의 많은 섹션은 사용자가 로그인하지 않았기 때문에 데이터로 채워지지 않았습니다.이 모든 섹션에는 "로그인" 이벤트에 대한 이벤트 수신기가 있습니다.이 모든 것은 클라이언트 측의 일입니다. 서버는 이러한 이벤트에 대해 알지 못합니다.
  • 사용자는 로그인 및 비밀번호를 입력한 후 제출 버튼을 누르면 Javascript 처리기가 클라이언트 측 변수에 사용자 이름 및 비밀번호를 기록합니다.그러면 이 처리기가 "로그인" 이벤트를 트리거합니다.다시 말하지만, 이것은 모두 클라이언트 측 작업이며, 자격 증명이 아직 서버로 전송되지 않았습니다.
  • 로그인 이벤트 수신기가 호출됩니다.각의 요청을 의 "RESTful API"로 .https://example.com/api페이지에 렌더링할 사용자별 데이터를 가져옵니다.RESTful인 서비스는 한 요청에서 다음 요청까지 클라이언트 상태를 유지할 수 없기 때문에 웹 서비스로 보내는 모든 요청에는 사용자 이름과 암호가 포함됩니다.웹 서비스가 보안 HTTP에 있으므로 암호는 전송 중에 안전하게 암호화됩니다.
  • 는 다음 주소:https://example.com/api에는 각각 인증 정보가 포함된 개별 요청이 많이 수신됩니다.각 요청의 사용자 이름과 암호는 사용자 데이터베이스에 대해 확인되며, 올바르게 발견되면 요청된 기능이 실행되고 데이터가 JSON 형식으로 클라이언트에 반환됩니다.사용자 이름과 암호가 일치하지 않으면 오류가 401 HTTP 오류 코드의 형태로 클라이언트에 전송됩니다.
  • 모든 요청에 대해 클라이언트가 사용자 이름과 암호를 보내도록 강요하는 대신 RESTful 서비스에서 사용자 이름과 암호를 가져오고 토큰으로 응답하는 "get_access_token" 기능을 사용할 수 있습니다. 이는 고유하고 일부 만료 날짜가 연관된 일종의 암호 해시입니다.이러한 토큰은 각 사용자와 함께 데이터베이스에 저장됩니다.그런 다음 클라이언트는 후속 요청에서 액세스 토큰을 보냅니다.그러면 액세스 토큰이 사용자 이름과 암호 대신 데이터베이스에 대해 유효성을 검사합니다.
  • 전화 앱과 같은 비브라우저 클라이언트 애플리케이션은 사용자에게 자격 증명을 입력한 다음 웹 서비스에 대한 모든 요청과 함께 해당 자격 증명(또는 해당 자격 증명에서 생성된 액세스 토큰)을 전송하도록 요청합니다.

이 예에서 중요한 요점은 RESTful 서비스는 모든 요청에 대한 인증이 필요하다는 것입니다.

이 시나리오에서 보안 계층을 추가하면 사용자 인증 외에도 클라이언트 응용 프로그램 인증이 추가됩니다.예를 들어, 웹 클라이언트, iOS 및 Android 앱이 모두 웹 서비스를 사용하는 경우 인증된 사용자가 누구인지에 관계없이 서버가 특정 요청의 클라이언트가 세 개 중 어느 것인지 알 수 있도록 할 수 있습니다.이를 통해 웹 서비스가 특정 기능을 특정 클라이언트로 제한할 수 있습니다.이를 위해 API 키와 비밀을 사용할 수 있으며, 에 대한 몇 가지 아이디어는 이 답변을 참조하십시오.

페이스북 인증

Facebook을 통한 로그인에는 Facebook 자체인 타사 로그인이 있으므로 위의 워크플로우는 Facebook 연결에 사용할 수 없습니다.로그인 절차를 수행하려면 사용자를 Facebook의 웹 사이트로 리디렉션해야 합니다. Facebook 웹 사이트에서 자격 증명이 우리의 통제 범위 밖으로 입력됩니다.

이제 상황이 어떻게 변하는지 살펴보겠습니다.

  • 가 사자가는위에 합니다.https://example.com
  • 서버는 초기 페이지를 렌더링하는 풍부한 Javascript 응용프로그램을 제공합니다.페이지에 "Facebook으로 로그인" 단추가 포함된 로그인 양식이 있습니다.
  • 는 "Facebook버튼을 은 (예를 들어) "Facebook" "Facebook" "Facebook" "Facebook" "Facebook" "합니다.https://example.com/auth/facebook.
  • https://example.com/auth/facebook경로는 passport.js에 의해 처리됩니다(설명서 참조).
  • 사용자가 보는 것은 페이지가 변경되어 Facebook 호스트 페이지에 로그인하고 웹 응용 프로그램을 인증해야 하는 것뿐입니다.이것은 완전히 우리의 통제 밖입니다.
  • 사용자가 Facebook에 로그인하고 응용 프로그램에 대한 권한을 부여하므로 Facebook은 이제 Passport.js 설정에서 구성한 콜백 URL로 다시 리디렉션됩니다. 이 URL은 문서의 예를 따릅니다.https://example.com/auth/facebook/callback
  • .js 파일에 passporthttps://example.com/auth/facebook/callback 액세스 하여 Facebook으로부터 Facebook은 Facebook과 Facebook 사이에 있습니다.
  • 이메일을 통해 데이터베이스에서 사용자를 찾고 Facebook 액세스 토큰을 저장할 수 있습니다.
  • Facebook 콜백에서 마지막으로 하는 일은 리치 클라이언트 애플리케이션으로 다시 리디렉션하는 것이지만, 이번에는 사용자 이름과 액세스 토큰을 클라이언트가 사용할 수 있도록 전달해야 합니다.이 작업은 여러 가지 방법으로 수행할 수 있습니다.예를 들어, Javascript 변수는 서버 측 템플릿 엔진을 통해 페이지에 추가하거나, 그렇지 않으면 쿠키가 이 정보와 함께 반환될 수 있습니다.(처음에 제안한 대로 URL에 이 데이터를 전달하는 것과 관련된 보안 문제를 지적해 준 @RyanKimber에게 감사드립니다.)
  • 이제 우리는 단일 페이지 앱을 한 번 더 시작하지만, 클라이언트는 사용자 이름과 액세스 토큰을 가지고 있습니다.
  • 클라이언트 응용프로그램은 "로그인" 이벤트를 즉시 트리거하고 응용프로그램의 다른 부분이 웹 서비스에 필요한 정보를 요청하도록 할 수 있습니다.
  • 다음으로 전송된 모든 요청https://example.com/api인증을 위한 Facebook 액세스 토큰 또는 REST API의 "get_access_token" 함수를 통해 Facebook 토큰에서 생성된 응용 프로그램 자체 액세스 토큰이 포함됩니다.
  • OAuth는 로그인을 위해 웹 브라우저가 필요하기 때문에 비브라우저 앱은 여기서 조금 더 어렵습니다.전화 또는 데스크톱 앱에서 로그인하려면 브라우저를 시작하여 Facebook으로 리디렉션해야 하며, 더 나쁜 것은 브라우저가 Facebook 액세스 토큰을 어떤 메커니즘을 통해 응용 프로그램으로 다시 전달하는 방법이 필요합니다.

저는 이것이 대부분의 질문에 대답하기를 바랍니다.물론 Facebook을 Twitter, Google 또는 기타 OAuth 기반 인증 서비스로 대체할 수 있습니다.

이 문제를 해결할 수 있는 간단한 방법이 있는지 알고 싶습니다.

@Miguel님께서 각 사례별로 전체 흐름을 설명해주셔서 대단히 감사합니다만, Facebook Authentication 부분에 몇 가지 추가하고자 합니다.

Facebook은 클라이언트 엔드에서 직접 액세스 토큰을 얻는 데 사용할 수 있는 Javascript SDK를 제공합니다. 이는 서버로 전달되고 Facebook에서 모든 사용자 정보를 가져오는 데 사용됩니다.그래서 당신은 기본적으로 어떠한 재 지시도 필요하지 않습니다.

또한 모바일 애플리케이션에도 동일한 API 끝점을 사용할 수 있습니다.Android/iOS SDK for Facebook을 사용하여 클라이언트 측에서 Facebook access_token을 취득하여 서버에 전달하기만 하면 됩니다.

설명한 바와 같이 상태 비저장 특성과 관련하여 get_access_token을 사용하여 토큰을 생성하고 클라이언트에 전달하면 이 토큰도 서버에 저장됩니다.그래서 세션 토큰만큼 좋고 나는 이것이 그것을 스테이트풀하게 만든다고 생각합니다.

내 2센트만..

다음은 인증에 도움이 되는 멋진 기사입니다.

  • 페이스북
  • 트위터
  • 구글
  • 로컬 인증

간편한 노드 인증:설정 및 로컬

언급URL : https://stackoverflow.com/questions/14572600/passport-js-restful-auth

반응형