/// <summary>
        /// 현재 설정으로 유효한 토큰을 확보합니다.
        /// </summary>
        /// <returns>토큰 정보</returns>
        public async Task <IamportToken> AuthorizeAsync()
        {
            ThrowsIfDisposed();
            var input = new IamportTokenRequest
            {
                ApiKey    = options.ApiKey,
                ApiSecret = options.ApiSecret
            };

            // TODO: 인증 코드는 UsersApi와 중복된 부분임.
            // 별도로 빼는 방법이 있을지?
            var url         = ApiPathUtility.Build(options.BaseUrl, UsersGetTokenPath);
            var httpRequest = new HttpRequestMessage(HttpMethod.Post, url);

            httpRequest.Content = new JsonContent(input);
            var response = await RequestAsync <IamportToken>(httpRequest);

            if (response.Code != 0)
            {
                throw new IamportResponseException(response.Code, response.Message);
            }

            var token = response.Content;

            lock (tokenLock)
            {
                httpClient.DefaultRequestHeaders.Remove(options.AuthorizationHeaderName);
                httpClient.DefaultRequestHeaders.Add(options.AuthorizationHeaderName, token.AccessToken);
                CurrentToken = token;
            }
            return(token);
        }
Example #2
0
        public async Task GetTokenAsync_throws_UnauthorizedAccessException_with_invalid_key_and_secret()
        {
            // arrange
            var client  = GetMockClient();
            var sut     = new UsersApi(client);
            var request = new IamportTokenRequest
            {
                ApiKey    = "invalid",
                ApiSecret = "invalid"
            };

            // act/assert
            await Assert.ThrowsAsync <UnauthorizedAccessException>(
                () => sut.GetTokenAsync(request));
        }
Example #3
0
        public async Task GetTokenAsync_throws_UnauthorizedAccessException_with_empty_or_null(string key, string secret)
        {
            // arrange
            var client  = GetMockClient();
            var sut     = new UsersApi(client);
            var request = new IamportTokenRequest
            {
                ApiKey    = key,
                ApiSecret = secret
            };

            // act/assert
            await Assert.ThrowsAsync <UnauthorizedAccessException>(
                () => sut.GetTokenAsync(request));
        }
Example #4
0
        /// <summary>
        /// 주어진 아임포트 토큰 요청을 인증하고 결과 토큰을 반환합니다.
        /// 인증에 실패하거나 입력 정보에 문제가 있을 경우 예외를 발생시킵니다.
        /// 이 API 호출은 내부 HttpClient의 Authorization 헤더를 설정하지 않습니다.
        /// 단지 요청한 토큰 정보에 대한 응답을 반환할 뿐입니다.
        /// </summary>
        /// <param name="request">아임포트 토큰 요청</param>
        /// <seealso>https://api.iamport.kr/#!/authenticate/getToken</seealso>
        /// <returns>인증된 아임포트 토큰</returns>
        public virtual async Task <IamportToken> GetTokenAsync(IamportTokenRequest request)
        {
            var iamportRequest = new IamportRequest <IamportTokenRequest>
            {
                RequireAuthorization  = false,
                ApiPathAndQueryString = $"{BasePath}/{UsersGetTokenPath}",
                Content = request,
                Method  = HttpMethod.Post,
            };
            var response = await client.RequestAsync <IamportTokenRequest, IamportToken>(iamportRequest);

            if (response.Code != 0)
            {
                throw new IamportResponseException(response.Code, response.Message);
            }
            return(response.Content);
        }
Example #5
0
        public async Task GetTokenAsync_returns_token()
        {
            // arrange
            var client  = GetMockClient();
            var sut     = new UsersApi(client);
            var request = new IamportTokenRequest
            {
                ApiKey    = "key",
                ApiSecret = "secret"
            };

            // act
            var result = await sut.GetTokenAsync(request);

            // assert
            Assert.False(string.IsNullOrEmpty(result.AccessToken));
            Assert.True(result.ExpiredAt >= DateTime.UtcNow);
        }