인가 코드와 사용자 토큰 받기
1. 인가 코드 받기
사용자 토큰을 발급 받기 위해서는 인가 코드(code)를 먼저 받아야 합니다.
- 인가 코드 받기는 웹 브라우저를 통해 요청을 합니다.
- redirect_uri로 전달된 code를 이용해 사용자 토큰과 교환 가능합니다.
- 사용자 토큰 발급에 사용된 code는 재사용 할 수 없습니다.
1.1. 요청 정보
요청 형식
웹 브라우저를 통해서 요청을 합니다.
- Request 형식
https://login.pre.wonders.app/wauth/authorize?response_type=code&client_id={client_id}&state={state}&redirect_uri={redirect_uri}&scope={scope}
- Request 예제
https://login.pre.wonders.app/wauth/authorize?response_type=code&client_id=sampleClientId&state=dnjsejfhrmdls&redirect_uri=&scope=public_profile
요청 파라미터
파라미터 | 설명 | 필수 여부 | 고정값 |
---|---|---|---|
response_type | "code" 문자열 값으로 고정합니다. | 필수 | code |
client_id | 위메프로그인에서 제공한 Client ID | 필수 | |
redirect_uri | 인가 코드를 리다이렉트 해줄 URI로 URL 인코딩 을 적용해서 보냅니다. redirect_uri는 등록된 Redirect URI 중 하나와 일치해야 합니다. |
필수 | |
state | 일반적으로 CSRF 공격을 방지하기 위해 임의로 생성된 고유 값을 입력합니다. 인가 코드를 리다이렉트시 해당 값이 전달됩니다. | 권장 | |
scope | 정보의 접근 범위 지정이 가능합니다. 보낼 scope이 여러개인 경우는 ,(comma) 를 구분자로 사용합니다. |
옵션 |
scope 값을 보내지 않은 경우는 클라이언트에 할당 받은 scope으로 설정되며 scope 값을 보내는 경우는 보낸 scope으로 설정됩니다. 할당 받지 않은 scope 값을 보낸 경우는 에러(invalid_scope)가 발생합니다.
비 로그인 상태라면 로그인 창으로 리다이렉트 되고, 사용자가 로그인을 하면 사용자 동의를 얻기 위한 페이지가 나타납니다. 사용자가 동의 또는 거부를 선택하면 redirect_uri로 결과가 리다이렉트 됩니다.
1.2. 응답 정보
응답 형식 및 예제
- Response 형식
{redirect_uri}?code={code}&state={state}
- Response 예제
https://sample.com/oauth/callback?code=YgI2cr&state=dnjsejfhrmdls
응답 파라미터
파라미터 | 설명 |
---|---|
code | 인가 코드 |
state | 인가 코드 요청 시 보낸 state 값 |
에러 응답 형식 및 예제
- Error Response 형식
{redirect_uri}?error={error}&error_description={error_description}&state={state}
- Error Response 예제
https://sample.com/oauth/callback?error=access_denied&error_description=User%20denied%20access&state=dnjsejfhrmdls
에러 응답 파라미터
파라미터 | 설명 |
---|---|
error | 인가 코드 요청 실패 시 전달되는 에러코드 |
error_description | 인가 코드 요청 실패 시 전달되는 에러메시지 |
state | 인가 코드 요청 시 보낸 state 값 |
에러 코드
error | 설명 | 오류 해결 방법 |
---|---|---|
invalid_scope | 요청한 scope가 유효하지 않은 경우 | "scope=public_profile"로 요청했는지 확인 |
access_denied | 사용자가 정보 제공 동의를 거부한 경우 | 사용자가 정보 제공을 거부했기 때문에 적절한 페이지로 리다이렉트 처리 |
invalid_client | Client ID가 유효하지 않은 경우 | 발급받은 ID가 정확한지 확인 |
invalid_grant | error_description="Invalid redirect ...": redirect_uri 가 유효하지 않은 경우 |
등록된 Redirect URI와 일치하는 확인 |
redirect_uri
,client_id
가 유효하지 않은 경우는 에러페이지가 출력됩니다. 화면에 나오는 응답메시지를 확인하고 오류를 해결합니다.
2. 사용자 토큰 받기
인가 코드를 사용하여 사용자 토큰을 받을 수 있습니다.
- 사용자 토큰 발급에 앞서 인가 코드 발급이 반드시 선행되어야 합니다.
- 요청
Header
에는Authorization
헤더를 반드시 포함해야 합니다. Authorization 요청 헤더 살펴보기
2.1. 요청 정보
Authorization 요청 헤더
-
문법
Authorization: {type} {credentials}
-
type
- 인증 타입으로 "Basic"을 사용합니다.
-
credentials
- 등록된 클라이언트 아이디와 시크릿 값 사이에 콜론(:) 값을 삽입한 문자열을 만듭니다.
{client_id}:{client_secret}
- 만든 문자열을
base64
인코딩하여 사용합니다.
- 등록된 클라이언트 아이디와 시크릿 값 사이에 콜론(:) 값을 삽입한 문자열을 만듭니다.
-
예제
Authorization: Basic c2FtcGxlXzJGSWp5aEZKNXg6bExrMW5mTnhPRkNETWJiVVRoVDk5REY3TzZ4Z0w0ekNBVjQ0ZVR4eU4xST0=
요청 형식 및 예제
- 요청 형식
POST /wauth/token
Host: login.pre.wonders.app
Authorization: Basic {base64_encode({client_id}:{client_secret})}
- 요청 예제
curl -i -X POST \
'https://login.pre.wonders.app/wauth/token' \
-H 'Authorization: Basic c2FtcGxlXzJGSWp5aEZKNXg6bExrMW5mTnhPRkNETWJiVVRoVDk5REY3TzZ4Z0w0ekNBVjQ0ZVR4eU4xST0=' \
-d 'grant_type=authorization_code' \
-d 'code=YgI2cr' \
-d 'redirect_uri=https://sample.com/oauth/callback'
요청 파라미터
파라미터 | 설명 | 필수 여부 | 고정값 |
---|---|---|---|
grant_type | "authorization_code" 고정 | 필수 | authorization_code |
code | 인가 코드 요청으로 받은 값 | 필수 | |
redirect_uri | 인가 코드 요청 시 사용한 redirect_uri | 필수 |
2.2. 응답 정보
응답 형식 및 응답 예제
-
응답 형식 응답 Body는 JSON 객체로 전달됩니다.
-
응답 예제
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
{
"access_token":"14e2ac4d-de40-4e39-8bda-bd1e89d2815b",
"token_type":"bearer",
"refresh_token":"1d342133-6148-4223-9870-b08b4403197d",
"expires_in":3599,
"scope":"public_profile"
}
응답 파라미터
파라미터 | 설명 |
---|---|
access_token | 사용자 정보 조회와 같은 API 요청 시에 필요한 access_token 입니다. |
token_type | 토큰 타입으로 "bearer" 타입을 사용합니다. |
refresh_token | 만료된 access_token 재발급을 위해 사용합니다. |
expires_in | access_token 만료 시간으로 단위는 초(second) 입니다. |
scope | 토큰이 접근 가능한 리소스의 범위입니다. |
에러 응답 형식 및 예제
HTTP/1.1 400
Content-Type: application/json;charset=UTF-8
{
"error":"invalid_grant",
"error_description":"Invalid authorization code: UkwB4b"
}
에러 응답 파라미터
파라미터 | 설명 |
---|---|
error | 사용자 토큰 요청 실패 시 전달되는 에러코드 |
error_description | 사용자 토큰 요청 실패 시 전달되는 에러메시지 |
에러 코드
error | error_description | 설명 | 오류 해결 방법 |
---|---|---|---|
invalid_request | 필수 파라미터를 누락하여 요청한 경우 | 요청에 누락된 값이 없는지 확인합니다. | |
unsupported_grant_type | Unsupported grant type: {요청한 grant_type 값} | 요청한 grant_type이 유효하지 않은 경우 | "grant_type=authorization_code"로 요청했는지 확인 |
invalid_grant | Redirect URI mismatch. | 요청한 redirect_uri가 유효하지 않은 경우 | 인가 코드 요청 시 사용한 redirect_uri와 일치하지 않은 경우로 동일한 값을 사용 |
invalid_grant | Invalid authorization code | 요청한 code가 유효하지 않은 경우 | 인가 코드 요청을 통해서 받은 code 인지 확인합니다. code는 발급 후 1분이 경과하면 만료되고, 사용자 토큰 발급에 사용된 code는 재사용 할 수 없습니다. |
응답의 상태 코드가 401(Unauthorized)인 경우는
Authorization 헤더
가 누락되거나 값이 정확하지 않은 경우입니다.Client ID
와Client Secret
값이 정확한지 확인하거나 문자열 조합이나 Base64 인코딩을 제대로 했는지 확인합니다.