OAuth HTTP ์˜ค๋ฅ˜ ์‘๋‹ต ์ฐธ์กฐ

์ด ํŽ˜์ด์ง€๋Š” Apigee ๋ฐ Apigee Hybrid์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

Apigee Edge ๋ฌธ์„œ ๋ณด๊ธฐ

์ด ์ฃผ์ œ์—์„œ๋Š” OAuth ์ •์ฑ…์ด Apigee์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์•ˆ๋‚ด๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ •์ฑ…๋ณ„ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋Š” OAuth v2 ์ •์ฑ… ์˜ค๋ฅ˜ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์Šน์ธ ์ฝ”๋“œ

์ž˜๋ชป๋œ ๋ฆฌ๋””๋ ‰์…˜ URI

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Invalid redirection uri http://www.invalid_example.com"}

๋ฆฌ๋””๋ ‰์…˜ URI ์—†์Œ

HTTP/1.1 400 Bad Request {"ErrorCode" : "invalid_request", "Error" :"Redirection URI is required"}

์ž˜๋ชป๋œ ํ‚ค

HTTP/1.1 401 Unauthorized {"ErrorCode" : "invalid_request", "Error" :"Invalid client id : AVD7ztXReEYyjpLFkkPiZpLEjeF2aYAz. ClientId is Invalid"}

ํ‚ค ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"The request is missing a required parameter : client_id"}

์ž˜๋ชป๋œ ์‘๋‹ต ์œ ํ˜•

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Response type must be code"}

์‘๋‹ต ์œ ํ˜• ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"The request is missing a required parameter : response_type"}

AccessToken ์ƒ์„ฑ

์ž˜๋ชป๋œ ์ธ์ฆ ์ฝ”๋“œ

HTTP status: 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Invalid Authorization Code"}

๋ฆฌ๋””๋ ‰์…˜ URI ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Required param : redirect_uri"}

์ž˜๋ชป๋œ ๋ฆฌ๋””๋ ‰์…˜ URI

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Invalid redirect_uri : oob"}

GenerateResponse๊ฐ€ false์ธ ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ํด๋ผ์ด์–ธํŠธ ID

์ด ์˜ค๋ฅ˜๋Š” <GenerateResponse> ์†์„ฑ์ด false๋กœ ์„ค์ •๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์— ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{
    "fault": {
        "faultstring": "Invalid client identifier {0}",
        "detail": {
            "errorcode": "oauth.v2.InvalidClientIdentifier"
        }
    }
}

GenerateResponse๊ฐ€ true์ธ ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ํด๋ผ์ด์–ธํŠธ ID

์ด ์˜ค๋ฅ˜๋Š” <GenerateResponse> ์†์„ฑ์ด true๋กœ ์„ค์ •๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์— ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{"ErrorCode" : "invalid_client", "Error" :"ClientId is Invalid"}

์ž˜๋ชป๋œ GrantType

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Unsupported grant type : client_credentials_invalid"}

์‚ฌ์šฉ์ž ์ด๋ฆ„ ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Required param : username"}

๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Required param : password"}

GrantType ์—†์Œ(์ปค์Šคํ…€ ์ •์ฑ…)

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Required param : grant_type"}

AuthCode ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Required param : code"}

์•”์‹œ์ 

์ž˜๋ชป๋œ ํด๋ผ์ด์–ธํŠธ ID

HTTP/1.1 401 Unauthorized
{"ErrorCode" : "invalid_request", "Error" :"Invalid client id : AVD7ztXReEYyjpLFkkPiZpLEjeF2aYAz. ClientId is Invalid"}

ํด๋ผ์ด์–ธํŠธ ID ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"The request is missing a required parameter : client_id"}

์ž˜๋ชป๋œ ์‘๋‹ต ์œ ํ˜•

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Response type must be token"}

์‘๋‹ต ์œ ํ˜• ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"The request is missing a required parameter : response_type"}

์ž˜๋ชป๋œ ๋ฆฌ๋””๋ ‰์…˜ URI

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Invalid redirection uri http://www.invalid_example.com"}

๋ฆฌ๋””๋ ‰์…˜ URI ์—†์Œ

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Redirection URI is required"}

๊ฐฑ์‹  ํ† ํฐ

์ž˜๋ชป๋œ RefreshToken

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Invalid Refresh Token"}

๋งŒ๋ฃŒ๋œ RefreshToken

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Refresh Token expired"}

์ž˜๋ชป๋œ ๋ฒ”์œ„

HTTP/1.1 400 Bad Request
{"ErrorCode" : "invalid_request", "Error" :"Invalid Scope"}

GenerateResponse๊ฐ€ false์ธ ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ํด๋ผ์ด์–ธํŠธ ID

์ด ์˜ค๋ฅ˜๋Š” GenerateResponse ์†์„ฑ์ด false๋กœ ์„ค์ •๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์— ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{
    "fault": {
        "faultstring": "Invalid client identifier {0}",
        "detail": {
            "errorcode": "oauth.v2.InvalidClientIdentifier"
        }
    }
}

GenerateResponse๊ฐ€ true์ธ ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ํด๋ผ์ด์–ธํŠธ ID

์ด ์˜ค๋ฅ˜๋Š” GenerateResponse ์†์„ฑ์ด true๋กœ ์„ค์ •๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์— ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{"ErrorCode" : "invalid_client", "Error" :"ClientId is Invalid"}

AccessToken ํ™•์ธ

์ž˜๋ชป๋œ AccessToken

HTTP/1.1 401 Unauthorized
{"fault":{"faultstring":"Invalid Access Token","detail":{"errorcode":"keymanagement.service.invalid_access_token"}}}

์ž˜๋ชป๋œ ๋ฆฌ์†Œ์Šค

HTTP/1.1 401 Unauthorized
{"fault":{"faultstring":"APIResource \/facebook\/acer does not exist","detail":{"errorcode":"keymanagement.service.apiresource_doesnot_exist"}}}

์ž˜๋ชป๋œ ๋ฒ”์œ„

HTTP/1.1 403 Forbidden
{"fault":{"faultstring":"Required scope(s) : VerifyAccessToken.scopeSet","detail":{"errorcode":"steps.oauth.v2.InsufficientScope"}}}

์ธ์ฆ ํ—ค๋” ์—†์Œ

HTTP/1.1 401 Unauthorized
{"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}

ApiProduct์™€ ์ผ์น˜ ํ•ญ๋ชฉ ์—†์Œ(Env ๋ฐ Proxy๊ฐ€ ๊ตฌ์„ฑ๋จ)

HTTP/1.1 401 Unauthorized
{"fault":{"faultstring":"Invalid API call as no apiproduct match found","detail":{"errorcode":"keymanagement.service.InvalidAPICallAsNoApiProductMatchFound"}}}

์•ก์„ธ์Šค ํ† ํฐ ๋งŒ๋ฃŒ

HTTP/1.1 401 Unauthorized
{"fault":{"faultstring":"Access Token expired","detail":{"errorcode":"keymanagement.service.access_token_expired"}}}

์•ก์„ธ์Šค ํ† ํฐ ์ทจ์†Œ

HTTP/1.1 401 Unauthorized
{"fault":{"faultstring":"Access Token not approved","detail":{"errorcode":"keymanagement.service.access_token_not_approved"}}}

OAuth V2 ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

์ž˜๋ชป๋œ ๊ฐฑ์‹  ํ† ํฐ

HTTP/1.1 404 Not Found
{"fault::{"detail":{"errorcode":"keymanagement.service.invalid_refresh_token"},"faultstring":"Invalid Refresh Token"}}

์ž˜๋ชป๋œ ์•ก์„ธ์Šค ํ† ํฐ

HTTP/1.1 404 Not Found
{
  "fault": {
    "faultstring": "Invalid Access Token",
    "detail": {
      "errorcode": "keymanagement.service.invalid_access_token"
    }
  }
}

๋งŒ๋ฃŒ๋œ ์•ก์„ธ์Šค ํ† ํฐ

HTTP/1.1 500 Not Found
{
  "fault": {
    "faultstring": "Access Token expired",
    "detail": {
      "errorcode": "keymanagement.service.access_token_expired"
    }
  }
}

๋งŒ๋ฃŒ๋œ ๊ฐฑ์‹  ํ† ํฐ

HTTP/1.1 500 Not Found
{
  "fault": {
    "faultstring": "Refresh Token expired",
    "detail": {
      "errorcode": "keymanagement.service.refresh_token_expired"
    }
  }
}

์ž˜๋ชป๋œ ํด๋ผ์ด์–ธํŠธ ID

HTTP/1.1 404 Not Found
{
  "fault": {
    "faultstring": "Invalid Client Id",
    "detail": {
      "errorcode": "keymanagement.service.invalid_client-invalid_client_id"
    }
  }
}

์ž˜๋ชป๋œ ์Šน์ธ ์ฝ”๋“œ

HTTP/1.1 404 Not Found
{
  "fault": {
    "faultstring": "Invalid Authorization Code",
    "detail": {
      "errorcode": "keymanagement.service.invalid_request-authorization_code_invalid"
    }
  }
}

๋งŒ๋ฃŒ๋œ ์Šน์ธ ์ฝ”๋“œ

HTTP/1.1 500 Not Found
{
  "fault": {
    "faultstring": "Authorization Code expired",
    "detail": {
      "errorcode": "keymanagement.service.authorization_code_expired"
    }
  }
}

OAuth V2 ์ •๋ณด ์„ค์ •

์ž˜๋ชป๋œ ์•ก์„ธ์Šค ํ† ํฐ

HTTP/1.1 404 Not Found
{
  "fault": {
    "faultstring": "Invalid Access Token",
    "detail": {
      "errorcode": "keymanagement.service.invalid_access_token"
    }
  }
}

๋งŒ๋ฃŒ๋œ ์•ก์„ธ์Šค ํ† ํฐ

HTTP/1.1 500 Not Found
{
  "fault": {
    "faultstring": "Access Token expired",
    "detail": {
      "errorcode": "keymanagement.service.access_token_expired"
    }
  }
}

OAuth V2 ์ •๋ณด ์‚ญ์ œ

์„ฑ๊ณตํ•˜๋ฉด ์ •์ฑ…์ด 200 ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‹คํŒจํ•˜๋ฉด ์ •์ฑ…์€ 404์™€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์•ก์„ธ์Šค ํ† ํฐ ๋˜๋Š” ์ธ์ฆ ์ฝ”๋“œ ์‚ญ์ œ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ„).

HTTP/1.1 404 Not Found
Content-Type: application/json
Content-Length: 144
Connection: keep-alive

{"fault":{"faultstring":"Invalid Authorization Code","detail":{"errorcode":"keymanagement.service.invalid_request-authorization_code_invalid"}}}