토큰 발급하기
유저네임 로그인 메서드는 로그인 세션을 바로 만들지 않습니다. 대신 발급 후 180초 동안만 유효한 authorizationCode를 반환합니다. 이 authorizationCode를 입력값으로 사용해 액세스 토큰과 리프레시 토큰을 발급해야 다음 단계에서 세션을 등록할 수 있습니다.
토큰 발급 요청에는 GrantType, ClientId, AuthorizationCode, CodeVerifier를 사용합니다.
1. 토큰 발급 메서드 호출 파라미터 준비
토큰 발급에 필요한 파라미터를 준비합니다.
GrantType
authorization_code를 사용합니다.
ClientId
Hive 콘솔이 프로젝트 단위로 발급하는 Client ID입니다. 같은 프로젝트에 속한 모든 App ID가 같은 값을 사용합니다. 값은 보안 키 획득에서 확인하세요.
AuthorizationCode
유저네임 로그인 응답의 AuthorizationCode를 사용합니다. 발급 후 180초가 지나면 만료되므로 로그인 직후 이어서 호출합니다.
CodeVerifier
CodeVerifier에는 유저네임 로그인 메서드 호출 시 보낸 codeChallenge와 짝이 되는 codeVerifier를 넣습니다.
2. 액세스 토큰과 리프레시 토큰 발급
IssueTokenAsync
IssueTokenAsync()를 호출해 authorizationCode로 액세스 토큰과 리프레시 토큰을 발급합니다. 인가 코드로 토큰을 발급할 때는 AuthorizationCodeTokenRequest를 사용합니다.
호출 파라미터
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| request | TokenRequest | Required | 토큰 발급 요청. 인가 코드를 입력값으로 사용하는 토큰 발급에는 AuthorizationCodeTokenRequest를 사용합니다. |
| context | ApiCallContext | Optional | 호출 단위 설정 객체입니다. 생략하면 기본값이 사용됩니다. |
AuthorizationCodeTokenRequest
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
GrantType | string | Required | authorization_code 고정 |
ClientId | string | Required | 프로젝트 단위로 발급되는 콘솔 보안 키의 Client ID |
AuthorizationCode | string | Required | 로그인 응답의 AuthorizationCode |
CodeVerifier | string | Required | 로그인 호출에 보낸 codeChallenge와 짝이 되는 codeVerifier |
호출 예시
요청 수행이 불가능한 공통 실패(Failure)의 결과 모델과 처리 원칙은 공통 오류 처리를 참조하세요.
using Hive.Axyl.Auth;
using Hive.Axyl.Core;
ITokenService token = HiveCore.Resolve<ITokenService>();
// authorizationCode는 [유저네임 로그인] 응답의 Data.AuthorizationCode,
// codeVerifier는 그 로그인 호출에 쓴 codeChallenge와 짝이 되는 값입니다.
// TokenIssueTokenResult 객체
var issueResult = await token.IssueTokenAsync(new AuthorizationCodeTokenRequest {
GrantType = "authorization_code",
ClientId = "{clientId}",
AuthorizationCode = authorizationCode,
CodeVerifier = codeVerifier, // 로그인 호출에 보낸 codeChallenge와 짝
});
if (issueResult is not TokenIssueTokenResult.Success issued)
{
// 토큰 발급 실패 처리 (InvalidGrant, InvalidGrantCodeChallenge 등)
return;
}
응답 데이터
성공 시 TokenIssueTokenResult.Success의 Data(TokenResponseData)에 토큰이 담깁니다.
| 필드명 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
Data.AccessToken | string | Required | 인증 메서드 호출에 사용하는 액세스 토큰 |
Data.RefreshToken | string? | Optional | 토큰 갱신에 사용하는 리프레시 토큰. 타입은 nullable이나 authorization_code 방식의 토큰 발급에서는 반환됩니다. |
Data.ExpiresIn | long | Required | 발급 시점으로부터 액세스 토큰이 만료되기까지 남은 시간(초)입니다. 리프레시 토큰의 만료에는 적용되지 않습니다. 다음 단계인 세션 활성화에서 만료 시각을 계산할 때 사용합니다. |
응답 예시
응답 상태
TokenIssueTokenResult의 응답 케이스는 switch 구문으로 처리하는 것을 권장합니다. 직접 처리하지 않는 케이스는 default에서 안전하게 처리하는 것을 권장합니다.
| 응답 케이스 | 설명 | 앱 클라이언트 대응 |
|---|---|---|
Success | 토큰 발급 성공. Data에 토큰이 담깁니다. | 다음 단계에서 SetSession으로 세션 등록 |
InvalidGrant | 인가 코드가 유효하지 않은 경우 | 로그인부터 다시 진행 |
InvalidGrantExpired | 인가 코드가 만료된 경우 | 로그인부터 다시 진행 |
InvalidGrantCodeChallenge | codeVerifier가 로그인 때 보낸 codeChallenge와 맞지 않는 경우 | PKCE 짝 확인 |
InvalidGrantRefreshToken | 리프레시 토큰이 유효하지 않은 경우. refresh_token 방식의 토큰 발급에서만 발생합니다. | 로그인부터 다시 진행 |
InvalidClient | Client ID가 올바르지 않은 경우 | 콘솔 보안 키 확인 |
UnsupportedGrantType | 지원하지 않는 GrantType인 경우 | "authorization_code" 확인 |
AppNotFound | 앱 정보를 찾을 수 없는 경우 | 콘솔의 앱 등록 상태 확인 |
TemporarilyUnavailable | 서버가 요청을 일시적으로 처리하지 못한 경우. InvalidGrant처럼 서버가 판정한 다른 응답 케이스와 달리, 같은 요청을 다시 보내면 결과가 달라질 수 있습니다. | 바로 다시 보내지 말고 간격을 두고 같은 요청을 다시 시도 |
UnknownOutcome | 이 SDK 버전이 알지 못하는 신규 결과 | 로깅 후 보수적으로 처리 |
Failure | 공통 Failure입니다. 필수 파라미터 누락 또는 형식 오류(invalid_parameter), 필수 필드 누락(missing_field), X-App-Id 헤더 누락(missing_app_id)도 이 경우에 해당합니다. 원인은 Failure.Problem.ExternalCode에 담깁니다. 공통 오류 처리를 참조하세요. | 공통 오류 처리 기준에 따라 처리 |