OAuth 2.0 ์ธ์ฆ

๐Ÿ“˜

OAuth 2.0์€ /ads ์—”๋“œํฌ์ธํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

API๋ฅผ ํ†ตํ•ด ์ฃผ๋ฌธ ๋ณด๊ณ ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ /orders ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ธฐ๋ณธ ์ธ์ฆ ๋ฐ ๋น„๋ฐ€ API ํ‚ค์™€ ํ†ตํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ID ๋ฐ ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ

๋‹ค์Œ client_id ๋ฐ client_secret ๊ธฐ์ˆ  ๊ณ„์ • ๊ด€๋ฆฌ์ž๊ฐ€ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ์€ ๊ฐœ์ธ์šฉ์ด๋ฏ€๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ํ† ํฐ ์š”์ฒญ

์•ก์„ธ์Šค ํ† ํฐ์„ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. client_id ๋ฐ client_secret. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์†Œ๋งค์—…์ฒด๊ฐ€ CitrusAd ์ธ์ฆ ์„œ๋ฒ„ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ POST ์š”์ฒญ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://$BASE_URL/v1/oauth2/token

๐Ÿ“˜

/oauth2/token ๊ด€๋ จ ํ† ํฐ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜๋Š” ์ด๋Ÿฌํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ†ตํ•ฉ ์—”๋“œํฌ์ธํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ฒญ ์‹œ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ์ธ์ฆ ์š”์ฒญ ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ „์†ก๋œ ๊ธฐ๋ณธ ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. client_id ๋ฐ client_secret base64 ์ธ์ฝ”๋”ฉ:

Authorization: "Basic" + base64encode(client_id + ":" + client_secret)

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. application/x-www-form-urlencoded HTTP ์š”์ฒญ ๋ณธ๋ฌธ ํ˜•์‹:

grant_type=client_credentials

์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

POST https://$BASE_URL/v1/oauth2/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <base64 encoded id+key>
grant_type=client_credentials

์•ก์„ธ์Šค ํ† ํฐ ์ˆ˜์‹ 

์‘๋‹ต์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • access_token: CitrusAd API ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉํ•  ์•ก์„ธ์Šค ํ† ํฐ
  • expires_in: ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„(์ดˆ)
  • token_type: ๋ฐ˜ํ™˜๋œ ํ† ํฐ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ํ•ญ์ƒ ์ „๋‹ฌ์ž์ž…๋‹ˆ๋‹ค

์ƒ˜ํ”Œ ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "access_token": "xxxxx.yyyyy.zzzzz",
  "expires_in": 3600,
  "token_type": "Bearer"
}

ํ† ํฐ ์‚ฌ์šฉํ•˜๊ธฐ

CitrusAd API ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ถŒํ•œ ํ—ค๋”์— ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ฐ„๋‹จํžˆ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Authorization: โ€œBearer โ€œ <access_token>

POST $BASE_URL/v1/ads/generate HTTP/1.1
accept: application/json
content-type: application/json
Authorization: Bearer <access_token>
{
    "customerId": "wertg5432a",
    "sessionId": "ec9-4e07-881d-3e9", 
    "placement": "category",
    "catalogId": "628dbe95-2ec9-4e07-881d-3e9f92ab2e0b",
    "productFilters": [
         ["category:Cupboard/Snacks"]
    ],
    "options": {
                             "filterMode": "AndOr"
                             },
    "maxNumberOfAds": 3
}

์š”์ฒญ ์˜ค๋ฅ˜

์œ ํšจํ•˜์ง€ ์•Š์€ ํด๋ผ์ด์–ธํŠธ

๋งŒ์•ฝ ์š”์ฒญ์—์„œ ์ „์†ก๋œ client_id ๋˜๋Š” client_secret ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

{
  "error": "invalid_client"
}

์˜ฌ๋ฐ”๋ฅธ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋‹ค์Œ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. client_id ๋ฐ client_secret ๋˜ํ•œ /token ์—”๋“œํฌ์ธํŠธ ํ˜ธ์ถœ ์‹œ ๊ธฐ๋ณธ ์ธ์ฆ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
##Invalid Request
์š”์ฒญ์— ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฐ’์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ํฌํ•จ๋˜์—ˆ๊ฑฐ๋‚˜ ํ˜•์‹์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ธ์ฆ ์„œ๋ฒ„์—์„œ ์ž˜๋ชป๋œ ์š”์ฒญ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{
  "error": "invalid_request"
}

๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  • ์š”์ฒญ ๋ณธ๋ฌธ์— grant_type=client_credentials ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค
  • ์š”์ฒญ ํ—ค๋”์— Content-Type ์„ ์ •ํ™•ํžˆ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค