보안 웹 서비스에도 액세스하는 iOS 앱에서 Facebook 인증을 위한 설계
목표: 사용자가 내가 실행 중인 보호된 웹 서비스에 액세스해야 하는 iOS 애플리케이션에 대해 Facebook으로 인증할 수 있습니다.
가정:로그인을 위해 Facebook을 사용하지 않기로 선택한 사용자를 위한 기본 인증(및 등록) 시스템이 있습니다.
세부사항:
- 시스템에 대한 별도의 계정/자격 증명을 만들지 않고 사용자가 Facebook에 로그인할 수 있는 옵션을 제공한다고 가정합니다.
- 고유한 기본 인증 메커니즘(사용자 이름 및 암호)을 지원하기 때문에 고유한 사용자 ID가 있으며 초기 자격 증명 유효성 검사 후 후속 상호 작용에 사용되는 인증 토큰을 발급합니다.
Facebook이 개발자 문서에 이에 대한 모범 사례가 없다는 것이 놀랍습니다.기존의 모든 설명서는 FB 인증을 웹 사이트에 구축하거나 인증이 필요한 서비스가 없는 독립형 모바일 앱을 가정한 것입니다.
이것이 어떻게 설계될 것인지에 대한 저의 초기 생각은 이렇지만 그것이 정확한지에 대한 검증을 원합니다.
- 클라이언트가 Facebook iOS 로그인을 팝업합니다.
- UI 사용자가 Facebook 자격 증명으로 로그인하고 액세스 토큰을 얻습니다.
- iOS 앱이 서버에 액세스 토큰을 전달합니다.
우리 서버는 액세스 토큰을 사용하여 FB 그래프 API와 통신하여 (a) 토큰을 검증하고 (b) 해당 액세스 토큰에 대한 FB 사용자 ID를 가져옵니다.
예: 서버에서 JSON 개체의 프로필 정보를 반환하는 https://graph.facebook.com/me/ ?access_token=XYZ를 호출합니다.
우리 서버는 유효하다고 가정하고 JSON 객체에서 사용자 ID를 추출하여 사용자가 이미 계정을 가지고 있는지 확인합니다.그렇다면 해당 세션에 사용할 자체 인증 티켓을 클라이언트에 발급합니다.사용자가 계정을 가지고 있지 않으면 Facebook 사용자 ID로 새 계정을 만들고 고유한 사용자 ID를 할당한 후 인증 티켓을 발급합니다.
- 그런 다음 클라이언트는 인증이 필요한 후속 상호 작용에 인증 티켓을 다시 전달합니다.
이것은 저에게 올바른 접근법인 것 같지만 제가 미친 듯이 기본적인 것을 놓치고 잘못된 (복잡한) 길을 가고 있는지 확신할 수 없습니다.
제가 직접 처리한 것입니다. 여기 저를 괴롭힌 부분이 있습니다.
5단계에서...사용자가 페이스북 아이디와 완전히 별개로 당신과 계정을 등록할 수 있는 거죠?그 다음에 그들이 페이스북으로 로그인할 때...그리고 당신은 방금 그들에게 두 번째 계정을 만들었고 그들의 첫 번째 계정을 잃었습니다.
웹 서비스에 로그인한 다음 페이스북에 로그인하고 페이스북 ID와 로컬 계정 간의 연결을 캡처하는 방법이 필요합니다.
그것과는 별개로, 당신의 계획은 확고하게 들립니다.
업데이트: Facebook은 이러한 시나리오를 설명하는 문서를 여기에 추가했습니다.
Facebook에 명시된 대로 https를 사용하여 인증 토큰을 서버로 전송합니다.
액세스 토큰 공유
당사의 데이터 정책은 사용자의 앱에 대한 액세스 토큰을 다른 앱과 공유하는 것을 명시적으로 금지합니다.그러나 개발자는 기본 구현과 동일한 앱의 서버 구현 간에 토큰을 공유할 수 있습니다.전송이 HTTPS를 사용하여 수행되는 한 동일한 앱 ID 사용).
제가 이 전략에서 볼 수 있는 한 가지 문제는 누군가가 다른 페이스북 앱을 위해 얻은 액세스 토큰을 당신에게 줄 수 있다는 것입니다.제가 알기로는 당신의 애플리케이션에 대한 접근 토큰인지 확인할 방법이 없으니 그냥 사용하시면 될 것 같습니다.
하지만, 그것은 매우 해롭게 들리지 않습니다.일반적으로 사용자/앱은 액세스 토큰을 공유하지 않고 보호하려고 합니다.
누군가가 자신의 사이트나 모바일 앱을 만들고, 사용자의 액세스 토큰을 얻고, API를 사용하여 인증을 시도할 수 있습니다.이 작업이 성공하면(사용자가 사이트에 Facebook 계정이 있음) 악의적인 사이트는 사용자를 가장한 API를 사용할 수 있습니다.
가능성은 좀 희박하지만, 효과가 있을 수 있다고 생각합니다.
편집: 결국 액세스 토큰의 유효성을 확인할 수 있는 방법이 있는 것 같습니다.사용자 액세스 토큰에서 응용 프로그램 ID 가져오기(또는 토큰에 대한 원본 응용 프로그램 확인) 질문에 대한 @Daaniel의 답변을 참조하십시오.
당신의 해결책은 완전히 효과가 있습니다.
어쩌면 대안이 될 수도 있습니다. 초기 사회 서비스 요청에서 고객에게 이메일을 받아 웹 서비스로 보내는 것이 어떨까요?웹 서비스는 이메일을 저장할 뿐만 아니라 소셜 제공업체도 저장할 수 있습니다.당신의 웹 서비스가 이메일의 출처를 확인할 수 없다는 것은 이해하지만, 당신의 웹 서비스와 당신의 고객 사이에는 높은 신뢰 관계가 있지 않습니까?만약 있다면, 당신은 적절한 장소에서 오는 이메일에 의존할 수 있을 것 같습니다.누가 이메일 기반 접근법을 바보처럼 만드는 명백한 것이 무엇인지 알려주세요.
언급URL : https://stackoverflow.com/questions/4623974/design-for-facebook-authentication-in-an-ios-app-that-also-accesses-a-secured-we
'programing' 카테고리의 다른 글
linq를 사용하여 목록에서 중복 제거 (0) | 2023.05.13 |
---|---|
모듈을 설치하는 동안 "레지스트리에서 가져오지 못했습니다." (0) | 2023.05.13 |
특정 길이의 하위 목록을 인쇄하려면 어떻게 해야 합니까? (0) | 2023.05.13 |
Node.js / Express.js - app.router는 어떻게 작동합니까? (0) | 2023.05.13 |
"스크립트 실행" 빌드 단계를 릴리스 구성으로 제한하려면 어떻게 해야 합니까? (0) | 2023.05.13 |