본문 바로가기

Daum Developers

서비스

iOS 로그인 SDK 가이드

목차

소개

iOS Native 앱 개발 시 Daum의 인증형 Open API들 중에 OAuth2로 제공되는 것들을 편리하게 사용할 수 있습니다. framework 형태로 제공되며 32bit, 64bit 모두 지원합니다.

요구 사항

  • Xcode 5.0.1 이상
  • iOS Deployment Target : iOS 6.0 이상

Client ID 발급

OAuth2를 이용하기 위해서는 Client ID가 필요합니다 콘솔에서 Client ID를 발급 받으실 수 있습니다. 아래 설명에서는 발급받은 client id를 123456789라고 가정하고 진행하겠습니다. 실제로 등록받으셔서 아래 내용을 따라가시길 바라고 예제로 사용하는 id는 정상동작하지 않습니다.

설치하기

SDK는 cocoapods를 통해 제공됩니다. cocoapods를 이용하지 않고 직접 프로젝트에 추가하시고 싶으신 분은 라이브러리를 통해 받으실 수 있습니다. 아래 설명은 Sample이라는 이름의 프로젝트가 있다고 가정하고 진행합니다.

cocoapods 설치하기

cocoapods는 java의 maven과 같이 일일이 라이브러리를 추가하지 않더라도 설정파일 하나로 의존성 관리를 할 수 있도록 도와줍니다.

아래의 명령어들을 터미널에서 실행해서 cocoapods를 설치하십시오.

$ sudo gem install cocoapods
$ pod setup>

다음 작업은 라이브러리를 적용하고자하는 프로젝트에 cocoapods환경을 적용하는 것입니다.먼저 Podfile이라는 파일을 만드시고 그 안에 아래와 같은 내용을 입력하고 저장합니다.

platform :ios, '6.0'
pod 'daum-oauth-sdk', '~> 1.0.0'

post_install do |r|
    r.project.targets.each do |target|
        target.frameworks_build_phase.files.each do |f|
            target.build_configuration_list.set_setting('VALID_ARCHS', 'arm64 armv7s armv7 x86_64 i386')
        end
    end
end

Sample.xcodeproj 프로젝트가 있는 폴더로 이동하셔서 아래의 명렁어를 실행하십시오.

$ pod install

실행하시고 폴더의 내용을 확인하시면 Pods 폴더와 Podfile.lock, Sample.xcworkspace 등이 생성된 것을 보실 수 있습니다. pod install 명령은 위와 같은 환경을 갖추어 주고, Podfile안에 있는 정보를 기준으로 필요한 라이브러리들을 연결해줍니다. 이제부터는 Sample.xcodeproj가 아닌 Sample.xcworkspace를 열어서 작업하시면 됩니다.혹시 podfile에 다른 라이브러리를 추가하거나 SDK버전을 변경해야 하는 등의 일이 생기면 아래 명령을 사용하시면 됩니다.

$ pod update

cocoapods를 사용하지 않을 경우

라이브러리를 직접 다운 받으시고 압축을 푸시면 아래와 같은 구성을 보실 수 있습니다.

이 중에 DaumOAuthSDK.framework를 끌어다가 프로젝트의 Frameworks에 추가 합니다.

아래처럼 build phase의 Link Binary With Libraries에 포함된 것이 확인 되셨다면 성공입니다.

Daum OAuth Client 설정하기

발급받은 client id 123456789는 아래와 같이 DaumOAuthClientID를 key값으로 info.plist에 설정해주시고 URL Types에 daum-123456789 를 추가해줍니다. 이것은 다음앱 혹은 사파리를 이용해 사용자 인증과정을 수행하고 client로 돌아올 때 사용합니다.

<img src="img/info.png" alt="">

만약 client id를 만드신 앱들에 공유할 필요가 있다면 공유하는 각각의 앱들을 구분하기 위해 suffix를 사용할 수 있고 info.plist에 DaumOAuthUrlSchemeSuffix를 key값으로 추가합니다.

예를 들어 suffix가 01이라면 URL Types에는 daum-123456789 대신 daum-123456789-01을 추가하시면 됩니다. daum-clientid-suffix의 규칙을 위배하면 인증에 실패합니다.

라이브러리 import

SDK의 모든 API는 DaumOAuthSDK.h를 import함으로써 접근 가능합니다.

#import <DaumOAuthSDK/DaumOAuthSDK.h>

MTOAuthmanager 사용

instance 생성

singleton으로 동작하고 아래와 같이 생성하실 수 있습니다.

MTOAuthManager *manager = [MTOAuthManager sharedInstance];

app to app 통신 대비

다음앱이나 safari를 통해 인증을 하기 때문에 인증된 정보를 받기 위해 appDelegate에 아래와 같이 코드를 추가해줍니다.

OAuth관련 처리를 위한 url이 아니면 NO가 리턴됩니다.

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
  return [[MTOAuthManager sharedInstance] handleUrl:url sourceApplication:sourceApplication annotation:annotation];
}

유효한 access token이 있는지 여부 확인

사용자의 정보에 접근을 하기 위해서 access token이 필요하고 이것은 사용자의 승인에 의해 발급이 됩니다.

MTOAuthManager *manager = [MTOAuthManager sharedInstance];
if (manager.isAuthorized) {
 //유효한 토큰이 있습니다
} else {
 //유효한 토큰이 없습니다
}

access token 발급받기

access token을 발급받는 과정은 다음앱이나 Safari를 통해서 이루어집니다.따라서 별도로 UI를 구성할 필요는 없습니다.

MTOAuthManager *manager = [MTOAuthManager sharedInstance];
[manager authorizeWithSuccess:^{
  //발급 성공
} failure:^(MTOAuthError *error) {
    //발급 실패
}];

인증형 API 사용하기

인증형 API는 유효한 access token이 있을 때만 사용이 가능합니다. 사용자 프로필을 예로 들면 아래와 같이 사용할 수 있습니다.

  • success 결과 object전달 방식
    1. 확장자가 json으로 되어있는 경우에는 json 결과를 parsing해서 NSDictionary와 NSArray에 담아서 전달합니다.
    2. 확장자가 xml인 경우에는 받은 데이터를 NSXMLParser에 담아서 parser 자체를 전달합니다.
    3. 그 외의 경우에는 받은 data를 NSData 자체로 전달합니다.
MTOAuthManager *manager = [MTOAuthManager sharedInstance];
[manager requestResourceWithPath:@"user/v1/show.json"
                         success:^(NSObject *object) {
                             //성공
                         } failure:^(MTOAuthError *error) {
                             //실패
                         }];

access token 발급 받고 바로 인증형 api 사용하기

아래와 같이 중첩해서 사용하셔도 무방합니다

MTOAuthManager *manager = [MTOAuthManager sharedInstance];
__weak MTOAuthManager *weakManager = manager;
[manager authorizeWithSuccess:^{
    [weakManager requestResourceWithPath:@"user/v1/show.json"
                             success:^(NSObject *object) {
                                 //성공
                             } failure:^(MTOAuthError *error) {
                                 //실패
                             }];
} failure:^(MTOAuthError *error) {
    //실패
}];

앱에 저장되어있는 access token 삭제하기

저장되어있는 token을 삭제할 수 있습니다.

MTOAuthManager *manager = [MTOAuthManager sharedInstance];
[manager expireAuthorization];

MTOAuth Error

모든 error는 MTOAuthError로 전달됩니다.

error domain

/**
 * access token 요청 중에 발생한 error domain.
 **/
extern NSString *const MTOAuthErrorDomainAuthorization;

/**
 * resource 요청 중에 발생한 error domain.
 **/
extern NSString *const MTOAuthErrorDomainResourceAccessing;

error code

error code들은 아래와 같이 정의되어있고 OAuth2 표준을 포함합니다.

/**
 * 일반 error.
 **/
typedef NS_ENUM(NSInteger, MTOAuthGeneralErrorCodes) {
    /**
     * 네트워크 연결 불량
     **/
    MTOAuthErrorNetwork = 1000,
    /**
     * 서버 오류
     **/
    MTOAuthErrorServer,
    /**
     * 서비스를 찾을 수 없음
     **/
    MTOAuthErrorServiceNotFound,
    /**
     *  알 수 없는 오류.
     **/
    MTOAuthErrorUnknown,
};

/**
 * Access Token을 받아올 때 발생하는 표준 에러.
 * http://tools.ietf.org/html/rfc6749#section-4.2.2.1

 **/
typedef NS_ENUM(NSInteger, MTOAuthAuthorizationErrorCodes) {
    /**
     * 필요한 prameter가 누락되는 등 잘못된 형태로 요청되었을 경우.
     **/
    MTOAuthErrorInvalidAuthorizationRequest = 2000,
    /**
     * 정상적으로 승인되지 않은 client.
     **/
    MTOAuthErrorUnauthorizedClient,
    /**
     * 접근이 거부됨
     **/
    MTOAuthErrorAccessDenied,
    /**
     *  허용하지 않는 response type.
     **/
    MTOAuthErrorUnsupportedResponseType,
    /**
     *  알 수 없는 scope
     **/
    MTOAuthErrorInvalidScope,
};

/**
 * Access Token으로 resource 요청시에 발생하는 표준 에러.
 * http://tools.ietf.org/html/rfc6750#section-3.1

 **/
typedef NS_ENUM(NSInteger, MTOAuthResourceAccessingErrorCodes) {
    /**
     * 필요한 prameter가 누락되는 등 잘못된 형태로 요청되었을 경우.
     **/
    MTOAuthErrorInvalidResourceRequest = 3000,
    /**
     * token이 만료되었거나 없는 경우 등.
     **/
    MTOAuthErrorInvalidToken,
    /**
     * access token이 요청한 API에 대한 권한을 갖고 있지 않음
     **/
    MTOAuthErrorInsufficientScope,
};

error 처리 예제

MTOAuthManager *manager = [MTOAuthManager sharedInstance];
[manager authorizeWithSuccess:^{
    //발급 성공
} failure:^(MTOAuthError *error) {
    if ([error.domain isEqualToString:MTOAuthErrorDomainAuthorization]
        && error.code == MTOAuthErrorAccessDenied) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"오류"
                                                    message:@"앱의 접근을 허용하지 않으시면 앱 기능 사용에 제약이 있습니다."
                                                   delegate:nil
                                          cancelButtonTitle:@"확인"
                                          otherButtonTitles:nil, nil];
        [alert show];
    }
}];

이용사례

좋은 사례를 갤러리에 올려주시면, 검토 후 추가하겠습니다.

참조링크