RESTful API의 사용자 권한 레벨


23

인터넷에서 가장 귀여운 고양이 순위를 매기는 회사가 있다고 가정 해 봅시다.

나는/cats/ 최신 귀여운 귀여운 고양이를 사용자 에게 제공하는 리소스 를 제공합니다.

사용자가 전혀 지불하지 않거나 등록하지 않은 경우 상위 3 마리의 고양이 만받을 수 있습니다. 337 달러를 지불하고 로그인 한 경우 상위 10 마리의 고양이, 1337 달러를 지불하고 로그인 한 경우 상위 100 마리의 고양이. 요청시 '사용자 식별자'가 있습니다.

요컨대, 소비자는 /cats/'사용자 순위'에 따라 고양이 수가 다릅니다 . 소비 측에 사용자 식별자가 있지만 소비 측에 사용자 레벨을 명시 적으로 표시하지 않습니다. 요청시 구독을 업그레이드 할 수 있음을 사용자에게 알리고 싶습니다 . 즉, 3 개의 고양이3 마리의 고양이 만 제공하기 때문에 3 마리의 고양이 를 구별해야합니다. 왜냐하면 그것은 사용자 레벨이 허용 한 것이기 때문입니다 .

소비자에게 충분한 권한이 없기 때문에 리소스를 제한하고 소비자가 갖는 것이므로 제한하는 가장 좋은 방법은 무엇입니까?

클라이언트는 순위를 업그레이드 할 수 있는지 어떻게 알 수 있습니까? 때문에 즉, 그들은 단지 제한된 자원을 가지고 그들이 권한이 없습니다. 가장 좋은 방법은 무엇입니까?

이것은 실제 사례를 크게 단순화 한 것입니다. 또한 명확히하기 위해-독서는 높이 평가됩니다.


최신 정보:

고려한 옵션은 다음과 같습니다.

  • 사용자 권한 개체를 클라이언트에 한 번 저장하고 계정 로그인 또는 업그레이드가 수행 될 때만 쿼리합니다.
  • nullJSON을 나타내는 값을 전달 했지만 값이 존재하지만 실제로는 아무것도 전송 되지 않았습니다. 3 마리의 고양이를 가진 사용자를위한 10 마리의 고양이는["Garfield","Sylvester","Puss in Boots",null*7]
  • 리소스 권한 쌍 전달 {cats:["Whiskers","Fluffy","Socks"],authCount:3}

나는 가장 좋은 방법으로 가장 귀여운 고양이를 배달하기 위해이 작업을 처음으로하고 싶습니다. 우리는하고 싶습니다.


4
지금 나는 귀여운 고양이의 사진을보고 싶어
캐리 켄달

나는 그것을 얻지 못한다. '사용자 수준'을 어디에도 저장하지 않으면 구별 할 수 없습니다. 서버에 사용자 정보가 저장되어 있지 않은 것처럼 들리므로 사용자 수준을 저장할 수 없습니다.
Jan Doggen

@ JanDoggen 서버에 사용자 수준이 있습니다 (클라이언트는 식별자를 서버에 전달합니다).
Benjamin Gruenbaum

도움? 1337 참조를 얻지 못합니까?
Marjan Venema

답변:


18

나는 그것이 당신의 청중에 달려 있다고 말하고 싶습니다.

노 개발자

청중이 개발자의 것이 아닌 경우 다음과 같이 진행합니다.

예제를 위해 JSON을 반환한다고 가정 해 봅시다.

GET /cats HTTP/1.1

{
    "cats": [
        "Can I haz cheeseburger",
        "If it fits, I sits",
        "It's caturday!"
    ],
    "permissions": {
        "level": "free",
        "information": "You have access to 3 cats. Upgrade to ... to get 10 cats!"
    }
}

또는 비슷한 것.

사용자는 자신의 계정 상태를 알 수 있으며 마케팅 메시지와 같이 원하는 정보를 입력 할 수 있습니다. 이 방법의 가장 중요한 점은 현재 계정 사용자에게 쉽게 가시성을 제공하는 것입니다.

개발자

그러나 독자가 순전히 개발자 인 경우 완전한 HTTP 호환 방식으로 진행하십시오. 메타 데이터를 저장하려면 HTTP 헤더를 사용하십시오.

예를 들면 다음과 같습니다.

GET /cats HTTP/1.1

X-Account: anonymous
X-Account-Possible-Upgrades: 2
X-Account-Limit: 3

그런 다음이 헤더의 의미에 대한 명확한 문서를 제공하십시오. 대부분의 개발자는 이러한 사용자 정의 헤더를 볼 때 특히 제한이있는 경우 문서를 바로 작성합니다. 더 나아가 헤더에 링크를 표시 할 수 있습니다. 또는 가격 페이지에 대한 링크를 표시 할 수 있습니다.

X-Account-Doc: http://your/doc

그러나 많은 개발자들이 HTTP의 작동 방식을 모릅니다.

그래서 당신의 전화입니다

하나는 더 정확하고 다른 하나는 더 접근하기 쉽습니다.

기타

귀하의 질문과 관련된 기타 기타 사항 :


1
부수적으로 HTTP 헤더에 들어가는 auth (ent / orize) 정보 중 일부는 메타 데이터이므로 효과적으로 접근하는 것이 좋습니다.
Jimmy Hoffa

@JimmyHoffa 실제로 메타 데이터이며, 처음 생각한 것은 HTTP 헤더를 사용하는 것입니다. 그러나이 경우 HTTP 헤더는 고객에게 충분한 가시성과 마케팅 메시지에 필요한 세분성을 제공하지 않습니다. (이 세부 사항을 추가하기 위해 답변을 편집했습니다.)
Florian Margaine

@JimmyHoffa 어떻게? 이 경우 402는 수행하지 않습니다. 당신은 무엇을 제안합니까?
Benjamin Gruenbaum

@ BenjaminGruenbaum 나는 응답 코드를 말하지 않았다, 나는 헤더를 말했다; 메타 데이터에 원하는 모든 사용자 정의 헤더를 추가 할 수 있습니다. 편안한 API의 모든 응답을 헤더에서 사용자 역할로 지정 UserRole = level1하거나 소비자가 항상 수신 한 모든 데이터를 제시하고, 다시 오는 데이터 모델이 요청마다 다를 수있는 모든 응답에서 일관되며 소비자는 항상 동일한 방식으로 역할을 확인할 수 있습니다.
지미 호파

1
@ BenjaminGruenbaum 나는 대답을 완전히 다시 작성했습니다.
Florian Margaine

4

클라이언트는 순위를 업그레이드 할 수 있는지 어떻게 알 수 있습니까?

클라이언트에 따라 다릅니다. 일반적으로 이러한 정보를 hyptertext 메시지 (일명 HTML) 형식으로 REST 메소드의 응답 본문에 넣을 수 있습니다. 그러나 REST API가 HTML 클라이언트와 함께 사용되는 경우에만 의미가 있습니다.

XML 및 JSON과 유사합니다.


편집 : 계정 유형 / 사용자 계획 마케팅과 API (이 약어 확장)를 사용하는 것을 혼동 할 수 있습니다. 나는 항상 비린내가 있기 때문에 이것을 섞지 않을 것입니다 (비즈니스 의사 결정은 소프트웨어 변경보다 빠른 변화가 필요할 수 있습니다.

대신 뉴스 레터를 통해 다른 채널을 통해 사용자에게 혜택이 무엇인지 알려주십시오.

이는 서비스에 가입 한 사람이 API에 대해 프로그래밍하는 사람이 아닌 경우 특히 효과적입니다. 예를 들면 다음과 같습니다.

George (36 명의 사랑스러운 새끼 고양이의 자랑스러운 게이 남자)는 cute-cats-4-me.com에 접속하여 16 세의 배우자 (Linux를 포함한 스크립팅 컴퓨터 시스템에 능숙한)에게 아파트의 벽에 멋진 작은 귀염둥이 고양이를 표시하는 디지털 간판 응용 프로그램.

따라서 이것을 재미있게 프로그래밍하는 사람은 실제로 정보의 가장 간단한 주소가 아닙니다.

또는 로그인 및 사용자 정보 메소드에 대한 응답으로 모든 세부 사항을 제공하십시오.

그러나 사용자가 프로그래밍 방식으로 고양이를 요청할 때, 왜 고양이가 세 마리 이상을 되 찾아야하는지 알고 있어야합니다. 그러나 코드로이 통신 문제를 해결하지는 못합니다.

그렇지 않으면 더 많은 쿼리를 한 다음 권한이 충분하지 않은 경우 실패 통지를 돌려주십시오. 그러나 이것은 사용자에게 친숙한 소프트웨어가 아닙니다.


1
@Racheet : 여자 아이들이 돈을 집에 가지고있을 때 문제가 있습니까?
hakre

1
나는 소녀들이 남자 친구가 프로그래밍을해야한다고 주장하는 예에 문제가 있습니다.
Racheet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.