REST API 승인 및 인증 (웹 + 모바일)
oAuth, Amazon REST API, HTTP Basic / Digest 등에 대해 읽었지만 모든 것을 "단일 조각"으로 가져올 수는 없습니다. 이것은 아마도 가장 가까운 상황 일 것입니다.- 모바일 애플리케이션 용 API 만들기-인증 및 권한 부여
API 중심의 웹 사이트 서비스를 구축하고 싶습니다. 그래서 (처음에는) 센터에 API가 있고 웹 사이트 (PHP + MySQL)는 네트워크 인터페이스를 통해 cURL , Android 및 iPhone을 통해 연결됩니다. 따라서 3 개의 주요 클라이언트-3 개의 API 키. 다른 개발자도 API 인터페이스를 통해 개발할 수 있으며 자체 API 키를 얻게됩니다. API 작업은 userLevel 상태에 따라 허용 / 거부됩니다. 관리자 인 경우 모든 항목을 삭제할 수 있으며 다른 모든 작업은 로컬 (계정) 데이터 만 조작 할 수 있습니다.
첫째, 권한 부여-oAuth + xAuth 또는 내 자신 만의 구현을 사용해야합니까 ( http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/RESTAuthentication.html?r=9197 참조 )? 내가 이해했듯이 Amazon 서비스 사용자는 == API user (have API key) 입니다. 내 서비스에서 표준 사용자 / 계정 (웹 사이트에 등록한 사람)과 개발자 계정 (API 키가 있어야하는 사람)을 분리해야합니다.
따라서 먼저 API 키 를 인증 한 다음 사용자 자체 를 인증해야 합니다. Amazon의 체계를 사용하여 개발자의 API 키를 확인 (앱 인증)하는 경우 사용자 인증에 어떤 sheme을 사용해야합니까?
내 사용자 이름과 비밀번호를 게시 api.example.org/auth한 후 ( HTTPS , HTTP Basic을 통해) 토큰을받는 방법에 대해 읽은 후 다음 요청마다 전달합니다. Android 와 웹 사이트 에 동시에 로그인 한 경우 토큰을 어떻게 관리 합니까? 첫 번째 요청 (사용자 이름과 암호가 전송 될 때)에만 SSL을 사용하고 서로에 대해 HTTP 만 사용하는 경우 중간자 공격은 어떻습니까? REST 서비스를 보호하는 이 예제 암호 의 문제가 아닙니까?
어쨌든 키를 보호하는 가장 좋은 방법은 전송하지 않는 것입니다.
즉, 우리는 일반적으로 모든 "API 키"에 비밀이 아닌 ID (예 : 1234)와 비밀 키 (예 : byte [64])의 두 부분이있는 체계를 사용합니다.
- API 키를 제공하는 경우 서비스 데이터베이스에 저장 (소금 및 해시)합니다.
- 사용자 계정 (암호로 보호됨)을 제공하는 경우 서비스 데이터베이스에 암호 (염분 및 해시)를 저장하십시오.
이제 소비자가 API에 처음 액세스하여 연결하려면
- "username"매개 변수 (비밀이 아닌 "john.doe")를 보냅니다.
- "APIkeyID"매개 변수 전송 (비밀이 아닌 "1234")
그를 돌려줘
- 데이터베이스의 솔트 (매개 변수 중 하나가 잘못된 경우 반복 가능한 솔트 (예 : sha1 (username + "notverysecret"))를 돌려주세요.
- 서버의 타임 스탬프
소비자는 작업을 빠르고 원활하게 유지하기 위해 세션 기간 동안 솔트를 저장해야하며 클라이언트와 서버 간의 시간 오프셋을 계산하고 유지해야합니다.
이제 소비자는 API 키와 암호의 솔트 된 해시를 계산해야합니다. 이런 식으로 소비자는 데이터베이스에 저장된 것과 똑같은 암호 및 API 키 해시를 가지지 만 보안이 전혀 필요하지 않습니다.
이제 소비자 가 실제 작업을 수행하기 위해 API에 하위 순서로 액세스 하면
- "username"매개 변수 (비밀이 아닌 "john.doe")를 보냅니다.
- "APIkeyID"매개 변수 전송 (비밀이 아닌 "1234")
- "RequestSalt"매개 변수 전송 (비밀이 아닌 임의의 바이트 [64])
- "RequestTimestamp"매개 변수 전송 (클라이언트 시간 및 알려진 오프셋에서 계산 됨)
- "RequestToken"매개 변수 (hash (passwordhash + request_salt + request_timestamp + apikeyhash))를 보냅니다.
서버는 리플레이 공격에 대해 안전하게하기 위해 과거 2 초 이상의 타임 스탬프를 허용하지 않아야합니다.
서버는 이제 클라이언트와 동일한 해시 (passwordhash + request_salt + request_timestamp + apikeyhash)를 계산할 수 있습니다.
- 클라이언트는 API 키를 알고 있습니다.
- 클라이언트는 올바른 암호를 알고 있습니다.
참고 URL : https://stackoverflow.com/questions/9386930/rest-api-authorization-authentication-web-mobile
'IT TIP' 카테고리의 다른 글
| .NET의 String.Normalize는 무엇을합니까? (0) | 2020.11.04 |
|---|---|
| Razor보기 파일 내에서 일반 구문을 사용하는 방법은 무엇입니까? (0) | 2020.11.04 |
| os.path.exists와 os.path.isdir의 장단점 (0) | 2020.11.04 |
| MemoryCache 스레드 안전성, 잠금이 필요합니까? (0) | 2020.11.04 |
| Golang에서 파일을 복사하는 간단한 방법 (0) | 2020.11.04 |