페이지 이동경로
  • Docs>
  • Kakao Login>
  • iOS

Kakao Login

iOS

This document describes how to integrate Kakao Login APIs into your service with the Kakao SDK for iOS.

To learn about each API in detail, refer to Concepts.

For a Kakao Login button, you can download the resources provided by Kakao or customize buttons according to your service user interface by referring to the Design Guide.

Note

According to the Apple's new policy, you must offer account deletion within your app along with account creation. Likewise, if you integrate Kakao Login into your service, you must also provide a function to unlink from your app because users are linked to your app when they log in with Kakao. This applies to the app submission starting January 31, 2022. For more information, refer to App Store Review Guidelines.

Before you begin

Before using Kakao Login APIs with the iOS SDK,

  1. Register the iOS platform.
  2. Add modules.
  3. Optional: Configure for Login with Kakao Talk.

Add modules

To implement Kakao Login, you need to install both the Kakao Login and Authentication modules. After adding KakaoSDKAuth (Authentication and token management module) and KakaoSDKUser (Kakao Login module) to the Podfile, add the import statement for the modules as follows.

Sample

Swift
RxSwift
import KakaoSDKCommon
import KakaoSDKAuth
import KakaoSDKUser
import KakaoSDKCommon
import RxKakaoSDKCommon
import KakaoSDKAuth
import RxKakaoSDKAuth
import KakaoSDKUser
import RxKakaoSDKUser
IMPORTANT: Changes on Kakao Login module

- Less than iOS 2.4.0: You should call 'AuthApi' in the KakaoSDKAuth module and 'UserApi' in the KakaoSDKUser module to use the Kakao Login APIs. - Since iOS 2.4.0 or higher: You can call 'UserAPi' in the KakaoSDKUser module only to use the Kakao Login APIs. However, to call the Checking token presence API related to user authentication, call 'AuthApi'. The code snippets have been updated along with this change.

Configuration for Login with Kakao Talk*

*This configuration is required for Login with Kakao Talk.

The Login with Kakao Talk allows users to move to Kakao Talk from a service app and go back to the app when the user selects [Accept and Continue] or [Cancel] on Kakao Talk. To implement this process, you must configure these things:

  1. Register Allowlist to allow Kakao Talk to run from your service app by referring to Register Allowlist.
  2. Set a Custom URL Scheme used to open Kakao Talk.
  3. Add the handleOpenUrl() method that asks to open the URL in the AppDelegate.swift file to complete the login process after coming back to the service app.

Sample

Swift
RxSwift
import KakaoSDKAuth
...

class AppDelegate: UIResponder, UIApplicationDelegate {
    ...
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if (AuthApi.isKakaoTalkLoginUrl(url)) {
            return AuthController.handleOpenUrl(url: url)
        }

        return false
    }
    ...
}
import RxKakaoSDKAuth
import KakaoSDKAuth
...

class AppDelegate: UIResponder, UIApplicationDelegate {
    ...
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if (AuthApi.isKakaoTalkLoginUrl(url)) {
            return AuthController.rx.handleOpenUrl(url: url)
        }

        return false
    }
    ...
}

If you make a project for an app in iOS 13 or higher, UIApplicationSceneManifest is added in the Info.plist file and UISceneDelegate.swift is set to use as a default. If you use UISceneDelegate.swift, add the handleOpenUrl() method in the SceneDelegate.swift file, instead of the AppDelegate.swift file.

If you use the SwiftUI App Life Cycle, add handleOpenUrl() inside the ${PROJECT_NAME}App class using onOpenURL() in the same way with initializing SDK.

Sample

Swift
RxSwift
SwiftUI App
import KakaoSDKAuth
...

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    ...
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        if let url = URLContexts.first?.url {
            if (AuthApi.isKakaoTalkLoginUrl(url)) {
                _ = AuthController.handleOpenUrl(url: url)
            }
        }
    }
    ...
}
import RxKakaoSDKAuth
import KakaoSDKAuth
...

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    ...
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        if let url = URLContexts.first?.url {
            if (AuthApi.isKakaoTalkLoginUrl(url)) {
                _ = AuthController.rx.handleOpenUrl(url: url)
            }
        }
    }
    ...
}
import SwiftUI
import KakaoSDKCommon
import KakaoSDKAuth
...

@main
struct SwiftUI_testApp: App {

    ...
    init() {
        // Initialize Kakao SDK.
        KakaoSDK.initSDK(appKey: "NATIVE_APP_KEY")
    }

    var body: some Scene {
        WindowGroup {
            // Handle Custom URL Scheme using onOpenURL().
            ContentView().onOpenURL(perform: { url in
                if (AuthApi.isKakaoTalkLoginUrl(url)) {
                    AuthController.handleOpenUrl(url: url)
                }
            })
        }
    }
    ...

}

Login

The Login API enables users to log in through Kakao Talk or their Kakao Account information.

IMPORTANT: Change on module that provides Kakao Login

The module that provides Kakao Login API has changed: - In iOS SDK 2.3.2 or less, the KakaoSDKAuth (or RxKakaoSDKAuth) module provides Kakao Login API. - In iOS SDK 2.4.0 or higher, the KakaoSDKUser (or RxKakaoSDKUser) module provides Kakao Login API.

Login with Kakao Talk

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Manage consent items
Advanced: Activate OpenID Connect(Optional)
Set Simple Signup(for Kakao Sync)
Required Required:
Required consent item
Common
isKakaoTalkLoginAvailable()
AuthFailureReason
iOS SDK
loginWithKakaoTalk()
ReactiveX iOS SDK
loginWithKakaoTalk()

For Login with Kakao Talk, you must configure some settings in advance.

After configuration, call the isKakaoTalkLoginAvailable() method that invokes the loginWithKakaoTalk() method to check if Kakao Talk has been installed on a user's device. loginWithKakaoTalk() runs Kakao Talk and prompts the Consent screen that asks consent.

To handle exceptions, refer to the AuthFailureReason section in API Reference.

Parameter

Name Type Description Required
launchMethod LaunchMethod Parameter to set Kakao Talk launch method.
.CustomScheme: Custom Scheme
.UniversalLink: Universal Link
(Default: .UniversalLink)
X
nonce String Parameter to strengthen security.
To prevent replay attacks, generate random strings and pass them as an argument.

IMPORTANT: Allowed to set only when you integrate Kakao Login with OpenID Connect.
X

Sample

Swift
RxSwift
// Check if Kakao Talk has been installed.
if (UserApi.isKakaoTalkLoginAvailable()) {
    UserApi.shared.loginWithKakaoTalk {(oauthToken, error) in
        if let error = error {
            print(error)
        }
        else {
            print("loginWithKakaoTalk() success.")

            // Do something
            _ = oauthToken            
        }
    }    
}
// Class member property
let disposeBag = DisposeBag()

// Check if Kakao Talk has been installed.
if (UserApi.isKakaoTalkLoginAvailable()) {   
    UserApi.shared.rx.loginWithKakaoTalk()
        .subscribe(onNext:{ (oauthToken) in
            print("loginWithKakaoTalk() success.")
        
            // Do something
             _ = oauthToken
        }, onError: {error in
            print(error)
        })
    .disposed(by: disposeBag)
}

When a user consents, Kakao identifies the user with the user's Kakao Account information linked to Kakao Talk, and then issues tokens. The iOS SDK provides the issued tokens through the OAuthToken object.

OAuthToken

The issued tokens are stored through the TokenManagerProvider class. The stored tokens are automatically added to the authorization header when calling the token-based APIs.

Name Type Description Required
accessToken String One of the tokens that authorizes you to call Kakao APIs and identifies users. O
expiredAt Date Validity period in seconds until the access token expires. O
refreshToken String One of the tokens that is used to gain new tokens. O
refreshTokenExpiredAt Date Validity period in seconds until the refresh token expires. O
scopes [String] List of scopes of user information to be retrieved with the issued access token. X
idToken String JSON Web Token that contain user's authentication information, encoded using Base64 algorithm.
For more details, refer to ID Token.

IMPORTANT: Only returned when you integrate Kakao Login with OpenID Connect.
If you call the Requesting additional consent API, only returned when openid is added to scope in the request.
X

Login with Kakao Account

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Manage consent items
Advanced: Activate OpenID Connect(Optional)
Set Simple Signup(for Kakao Sync)
Required Required:
Required consent item
Common
AuthFailureReason
iOS SDK
loginWithKakaoAccount()
ReactiveX iOS SDK
loginWithKakaoAccount()

For Login with Kakao Account, call the loginWithKakaoAccount() method that runs a web browser and prompts the Consent screen that asks consent.

Parameter

Name Type Description Required
prompts [Prompt] Used to request reauthentication by selecting whether to present an interactive UI.
- .Login: Used when requesting reauthentication even though a user has already been authenticated by presenting the Kakao Account Login screen to a user. Not available in Kakao Talk in-app browser.
- .Create: Used to prompt the Kakao Account sign-up page first. The Kakao Login consent screen will be present after signing up for Kakao Account.
- .SelectAccount: Used to prompt the Kakao Account easy login. If Kakao Account login sessions are on the browser, the login page processes login automatically or prompts the account selecting page. The account selecting page is prompted when there are more than two Kakao Account login sessions on the browser.
X
loginHint String Used to request with Login hint
A value to fill in ID field of the Kakao Account login page.

Note: Highly recommend to refer to Login process with login hint
Note: Users can login with their email, phone number, and ID of Kakao Mail on the Kakao Account login page.
X
serviceTerms String Used to request Get consent to desired service terms API.
Tags of desired service terms.
You can find tag values in [My Application] > [Simple Signup].
Pass the tag values as a comma-separated string.
X
nonce String Parameter to strengthen security.
To prevent replay attacks, generate random strings and pass them as an argument.

IMPORTANT: Allowed to set only when you integrate Kakao Login with OpenID Connect.
X

Sample

Swift
RxSwift
UserApi.shared.loginWithKakaoAccount {(oauthToken, error) in
        if let error = error {
            print(error)
        }
        else {
            print("loginWithKakaoAccount() success.")            

            // Do something
             _ = oauthToken            
        }
    }
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.loginWithKakaoAccount()
    .subscribe(onNext:{ (oauthToken) in
        print("loginWithKakaoAccount() success.")

        // Do something
        _ = oauthToken        
    }, onError: {error in
        print(error)
    })
    .disposed(by: disposeBag)

When a user consents, Kakao identifies the user through the user's Kakao Account cookie stored on the default web browser and then issues tokens through the OAuthToken class.

Advanced: Request reauthentication

You can request reauthentication regardless of a user's login status to enhance security. Set prompts to .LOGIN, and pass it when calling loginWithKakaoAccount(). Then, the login screen is prompted even though a user has already been logged in on the same web browser on the device.

Swift
RxSwift
UserApi.shared.loginWithKakaoAccount(prompts:[.Login]) {(oauthToken, error) in
    if let error = error {
        print(error)
    }
    else {
        print("loginWithKakaoAccount() success.")           
        
        // Do something
        _ = oauthToken
            
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.loginWithKakaoAccount(prompts: [.Login])
    .subscribe(onNext:{ (oauthToken) in
        print("loginWithKakaoAccount() success.")

        // Do something
        _ = oauthToken        
    }, onError: {error in
        print(error)
    })
    .disposed(by: disposeBag)
Advanced: Log in after signing up for Kakao Account

You can request to prompt the Kakao Account sign-up page before Kakao Login. Set prompts to .Create, and pass it when calling loginWithKakaoAccount(). The Kakao Login consent screen will be present after signing up for Kakao Account.

Swift
RxSwift
UserApi.shared.loginWithKakaoAccount(prompts:[.Create]) {(oauthToken, error) in
    if let error = error {
        print(error)
    }
    else {
        print("loginWithKakaoAccount() success.")           
        
        // Do something
        _ = oauthToken
            
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.loginWithKakaoAccount(prompts: [.Create])
    .subscribe(onNext:{ (oauthToken) in
        print("loginWithKakaoAccount() success.")

        // Do something
        _ = oauthToken        
    }, onError: {error in
        print(error)
    })
    .disposed(by: disposeBag)

Check token presence

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Required - Common
hasToken()

To check if a user has obtained an access token through Kakao Login, call the hasToken() method in AuthApi. This API returns the presence of an access token or refresh token as a boolean type. However, note that the return value true does not guarantee that the user is in a logged-in state.

Sample

Swift
RxSwift
if (AuthApi.hasToken()) {
    UserApi.shared.accessTokenInfo { (_, error) in
        if let error = error {
            if let sdkError = error as? SdkError, sdkError.isInvalidTokenError() == true  {
                //Login is required.
            }
            else {
                //Handle other errors.
            }
        }
        else {
            //Succeeded in validating token (Token is refreshed if needed).
        }
    }
}
else {
    //Login is required.
}
// Class member property
let disposeBag = DisposeBag()
                    
if (AuthApi.hasToken()) {
    UserApi.shared.rx.accessTokenInfo()
        .subscribe(onSuccess:{ (_) in
            //Succeeded in validating token (Token is refreshed if needed).
        }, onFailure: {error in
            if let sdkError = error as? SdkError, sdkError.isInvalidTokenError() == true  {
                //Login is required.
            }
            else {
                //Handle other errors.
            }
        })
        .disposed(by: disposeBag)
}
else {
    //Login is required.
}

If the value false is returned, it means that a token does not exist. In this case, implement a process for a user to log in to issue a token. On the other hand, if the return value is true, you can validate the access token that the user has through the accessTokenInfo() method in UserApi, and then proceed as follows depending on the request result:

  • If the request is successful, the access token information is returned,
    • Access token is valid, which means the user does not need to log in.
    • You can call the Kakao APIs with the access token.
  • If an error occurs,
    • Access and refresh tokens are invalid, which means the user needs to log in.
    • You need to handle errors by referring to API Reference.

Logout

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Required - iOS SDK
logout()
ReactiveX iOS SDK
logout()

The Logout API deletes the access and refresh token issued through the login process to have a user log out. You need to call the logout() method in UserApi class.

Regardless of the result of the logout request, the iOS SDK deletes the access and refresh tokens and has the login session end.

Sample

Swift
RxSwift
UserApi.shared.logout {(error) in
    if let error = error {
        print(error)
    }
    else {
        print("logout() success.")
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.logout()
    .subscribe(onCompleted:{
        print("logout() success.")
    }, onError: {error in
        print(error)
    })
    .disposed(by: disposeBag)

Unlink

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Required - iOS SDK
unlink()
ReactiveX iOS SDK
unlink()

The Unlink API unlinks a user's Kakao Account from a service app. Call the unlink() method defined in the UserApi class.

If the request is successful, the iOS SDK deletes the access and refresh tokens. As the issued tokens are deleted, the session between an app and a user is disconnected, and the user is logged out and unlinked from your app.

Sample

Swift
RxSwift
UserApi.shared.unlink {(error) in
    if let error = error {
        print(error)
    }
    else {
        print("unlink() success.")
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.unlink()
    .subscribe(onCompleted:{
        print("unlink() success.")
    }, onError: {error in
        print(error)
    })
    .disposed(by: disposeBag)

Retrieve token information

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Required - Common
AccessTokenInfo
iOS SDK
accessTokenInfo()
ReactiveX iOS SDK
accessTokenInfo()

You can simply check the validity of the access token and refresh token, instead of requesting user information. Call the accessTokenInfo() method in the UserApi.

Sample

Swift
RxSwift
// Retrieve the expiration time of the access token.
UserApi.shared.accessTokenInfo {(accessTokenInfo, error) in
    if let error = error {
        print(error)
    }
    else {
        print("accessTokenInfo() success.")

        // Do something
        _ = accessTokenInfo        
    }
}
// Class member property
let disposeBag = DisposeBag()

// Retrieve the expiration time of the access token.
UserApi.shared.rx.accessTokenInfo()
    .subscribe(onSuccess:{ (accessTokenInfo) in        
        print("accessTokenInfo() success.")

        // Do something
        _ = accessTokenInfo 
        
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)
AccessTokenInfo
Name Type Description Required
id Int64 Service user ID. X
appId Int64 App ID that the access token has been issued for. O
expiresIn Int64 Validity period in seconds until the access token expires.

NOTE: expiresInMillis has been deprecated and replaced with expiresIn.
O

Retrieve user information

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Manage consent items
Required Required:
All consent items to request user information
Common
User
iOS SDK
me()
ReactiveX iOS SDK
me()

Note

To retrieve user data, you must set consent items and obtain user's consent for the data that your service needs. If a user does not consent, you cannot get the user data. To check which scopes a user has already agreed, you can call the Retrieving consent details API and check the agreed scopes first.

To retrieve the information of the user who is currently logged in, call me() method defined in the UserApi class through the shared object.

Sample

Swift
RxSwift
UserApi.shared.me() {(user, error) in
    if let error = error {
        print(error)
    }
    else {
        print("me() success.")
        
        // Do something
        _ = user
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.me()
    .subscribe (onSuccess:{ user in
        print("me() success.")
        
        // Do something
        _ = user        
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)

The user information in response to this request is passed to the User class defined in KakaoSDKUser. For example, you can access user.id to retrieve Service user ID, user.kakaoAccount.profile for Kakao Account's profile information, user.kakaoAccount.email for email.

User
Name Type Description Required
id Int64 Service user ID. O
hasSignedUp Bool Only returned when the Auto-link setting is disabled.
Whether the user is completely linked with (signed up) your app.
false: Preregistered
true: Registered
X
connectedAt Date The time when the user is linked with a service in UTC*. X
synchedAt Date The time when the user is logged in through Kakao Sync Simple Signup in UTC*.
This value is only passed for Kakao Sync service users. In this case, its value is the same as connected_at.
X
properties [String : String] Additional user information saved on the Kakao platform to use it later.
Refer to Prerequisites > Manage user properties.
X
kakaoAccount Account Kakao Account information.
To see what user data you can get, refer to User information included in Kakao Account.
X

Ensure that you need to handle exceptions for the following cases in which you cannot get the user information:

  • If you do not enable the consent item for some user information.
  • If a user has not agreed to provide the user information to the third-party service.
  • If a user has not provided the user information to Kakao.

Shipping address

Select shipping address

Basic information
Permission Prerequisite Kakao Login User consent Reference
Required Register platforms
Activate Kakao Login
Manage consent items
Required Required:
Shipping information
Common
ShippingAddress
iOS SDK
selectShippingAddresses()
ReactiveX iOS SDK
selectShippingAddresses()

Prompts the shipping address picker to allow users to select a shipping address and returns the selected shipping address ID.

Call shippingAddresses() in UserApi. This API returns an addressId for the selected shipping address. Request Retrieve shipping address with the addressId to get the detailed shipping address.

Swift
RxSwift
// Select shipping address
UserApi.shared.selectShippingAddress { (addressId, error) in
  if let error = error {
    print(error)
  } else {
    // Retrieve shipping address
    if let addressId = addressId {
      UserApi.shared.shippingAddresses(addressId: addressId) { (shippingAddress, error) in
        if let error = error {
          print(error)
        } else {
          print(shippingAddress)
        }
      }
    }
  }
}
let disposeBag = DisposeBag()

// Select shipping address
UserApi.shared.rx.selectShippingAddress()
  .flatMap({ addressId in
    // Retrieve shipping address
    UserApi.shared.rx.shippingAddresses(addressId: addressId)
  })
  .subscribe { shippingAddress in
    print(shippingAddress)
  } onFailure: { error in
    print(error)
  }
  .disposed(by: disposeBag)

Refer to Troubleshooting for the error cause.

Retrieve shipping address

Basic information
Permission Prerequisite Kakao Login User consent Reference
Required Register platforms
Activate Kakao Login
Manage consent items
Required Required:
Shipping information
Common
ShippingAddress
iOS SDK
shippingAddresses()
ReactiveX iOS SDK
shippingAddresses()

Retrieves shipping addresses saved in the user's Kakao Account.

Call shippingAddresses() in UserApi. Use the parameters below if necessary.

Name Type Description Required
addressId Int64 Shipping address ID
Used to specify an address ID to get a specific shipping address.
Do not use together with fromUpdatedAt and pageSize.
X
fromUpdatedAt Date If multiple shipping addresses are returned through multiple pages, only the shipping addresses that are changed after updated_at time return.
The last shipping address on the previous page is used for an input value for the next page.
If set to 0, shipping addresses are retrieved from the beginning.
X
pageSize Int Number of (two or more) shipping addresses displayed on a page.
(Default: 10)
X

If not using Select shipping address API, the response may not include the shipping address when the user did not consent to the [Shipping information]. Refer to No shipping address in the response.

Swift
RxSwift
UserApi.shared.shippingAddresses {(shippingAddress, error) in
    if let error = error {
        print(error)
    }
    else {
        print("shippingAddresses() success.")
        // Do something
        _ = shippingAddress
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.shippingAddresses()
    .subscribe(onSuccess:{ (shippingAddress) in
        print("shippingAddresses() success.")

        // Do something
        _ = shippingAddress               
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)

shippingAddresses() returns the UserShippingAddresses object. Refer to Troubleshooting for the error cause.

UserShippingAddresses
Name Type Description Required
userId Int64 Service user ID of a user who requested shipping addresses. X
shippingAddresses [ShippingAddress] List of shipping addresses that the user added.
The default shipping address is displayed on the uppermost, and the rest addresses are sorted by last updated date in decending order.
If a user does not agree to provide shipping addresses, nil is returned. In this case, after checking if needsAgreement is true, request additional consent.
O
needsAgreement Bool Whether consent to shipping addresses is required. X
ShippingAddress
Name Type Description Required
id Int64 Shipping address ID. O
name String Shipping address name. X
isDefault Bool Whether the shipping address is a default address or not. O
updatedAt Date The time when a user updated the shipping address. X
type Type Shipping address type.
- OLD: Administrative address
- NEW : Road name address.
X
baseAddress String Base address that is automatically input when searching for a zipcode. X
detailAddress String Detailed address that a user adds to the base address. X
receiverName String Recipient name. X
receiverPhoneNumber1 String Recipient phone number. X
receiverPhoneNumber2 String Additional recipient phone number. X
zoneNumber String New type of 5-digit postal code for a road name address system.
Required for the road name address system.
X
zipCode String Old type of 6-digit postal code for an administrative address system.
Optional for the administrative address system because some old type of addresses may not have a zip code.
X

Store user information

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Manage user properties
Required - iOS SDK
updateProfile()
ReactiveX iOS SDK
updateProfile()

You can store or update additional user information into the user property keys that you designated in [My Application] > [User Properties].

Call the updateProfile() method defined in the UserApi class. You must pass the custom property keys and values that you want to upadate through properties in a key-value pair. For example, if you want to update a user's clothing size, set properties to ["clothing_size":"small"].

Parameter

Name Type Description Required
properties [String:Any] Pass the scope and value to be updated in a key-value pair as an array.
Check the property keys of user information that you want to update in [My Application] > [User Properties] by referring to Manage user properties.
You can also add new property keys up to five.
O

Sample

Swift
RxSwift
UserApi.shared.updateProfile(properties: ["${CUSTOM_PROPERTY_KEY}":"${CUSTOM_PROPERTY_VALUE}"]) {(error) in
    if let error = error {
        print(error)
    }
    else {
        print("updateProfile() success.")
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.updateProfile(properties:["${CUSTOM_PROPERTY_KEY}":"${CUSTOM_PROPERTY_VALUE}"])
    .subscribe(onCompleted:{
        print("updateProfile() success.")  
    }, onError: {error in
        print(error)
    })
    .disposed(by: disposeBag)

Request additional consent

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Manage consent items
Advanced: Activate OpenID Connect(Optional)
Set Simple Signup(for Kakao Sync)
Required Required:
Required consent item
Common
AuthFailureReason
iOS SDK
loginWithKakaoAccount()
ReactiveX iOS SDK
loginWithKakaoAccount()

You can request consent to access permission or specific personal information if the user has not agreed when the user logged in with Kakao. Before using this API, read Concepts > Request additional consent thoroughly for a better understanding.

Call the loginWithKakaoAccount() method defined in the UserApi class. Pass the scopes of user information you want to request additional consent through scopes as an array of strings.

Parameter

Name Type Description Required
scopes [String] Pass the scope IDs of the User information. You can figure out each scope's ID in [My Application] > [Kakao Login] > [Consent Items].

IMPORTANT: If you implement OpenID Connect (OIDC), you must add openid to scopes along with the scope values you want to obtain consent. If not, OAuth is applied even though OIDC is enabled.
O
nonce String Parameter to strengthen security.
To prevent replay attacks, generate random strings and pass them as an argument.

IMPORTANT: Allowed to set only when you integrate Kakao Login with OpenID Connect.
X

Sample

Here is an example of checking which scopes are required to get consent with the me() method and requesting additional consent by passing scopes when calling loginWithKakaoAccount().

Swift
RxSwift
UserApi.shared.me() { (user, error) in
    if let error = error {
        print(error)
    }
    else {
        
        if let user = user {            
            
            //Add the desired scope among the list of all scopes.
            var scopes = [String]()
            if (user.kakaoAccount?.profileNeedsAgreement == true) { scopes.append("profile") }
            if (user.kakaoAccount?.emailNeedsAgreement == true) { scopes.append("account_email") }
            if (user.kakaoAccount?.birthdayNeedsAgreement == true) { scopes.append("birthday") }
            if (user.kakaoAccount?.birthyearNeedsAgreement == true) { scopes.append("birthyear") }
            if (user.kakaoAccount?.genderNeedsAgreement == true) { scopes.append("gender") }
            if (user.kakaoAccount?.phoneNumberNeedsAgreement == true) { scopes.append("phone_number") }
            if (user.kakaoAccount?.ageRangeNeedsAgreement == true) { scopes.append("age_range") }
            if (user.kakaoAccount?.ciNeedsAgreement == true) { scopes.append("account_ci") }
            
            if scopes.count > 0 {
                // If OpenID Connect (OIDC) is enabled,
                // - When "openid" is added to `scopes`, OIDC is applied.
                // - When "openid" is not added to `scopes`, OAuth 2.0 is applied. 
                                                    
                // To use OIDC, add "openid" to `scopes`.
                // scopes.append("openid")
                
                // The tokens are refreshed for the designated scopes.
                UserApi.shared.loginWithKakaoAccount(scopes: scopes) { (_, error) in
                    if let error = error {
                        print(error)
                    }
                    else {
                        UserApi.shared.me() { (user, error) in
                            if let error = error {
                                print(error)
                            }
                            else {
                                print("me() success.")
                                
                                // Do something
                                _ = user
                            }
                        }
                    }
                }
            }
            else {
                print("Not need to get additional consent.")
            }
        }
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.me()
    .map({ (user) -> User in

        //Add the desired scope among the list of all scopes.
        var scopes = [String]()
        
        if (user.kakaoAccount?.profileNeedsAgreement == true) { scopes.append("profile") }
        if (user.kakaoAccount?.emailNeedsAgreement == true) { scopes.append("account_email") }
        if (user.kakaoAccount?.birthdayNeedsAgreement == true) { scopes.append("birthday") }
        if (user.kakaoAccount?.birthyearNeedsAgreement == true) { scopes.append("birthyear") }
        if (user.kakaoAccount?.genderNeedsAgreement == true) { scopes.append("gender") }
        if (user.kakaoAccount?.phoneNumberNeedsAgreement == true) { scopes.append("phone_number") }
        if (user.kakaoAccount?.ageRangeNeedsAgreement == true) { scopes.append("age_range") }
        if (user.kakaoAccount?.ciNeedsAgreement == true) { scopes.append("account_ci") }
        
        if (scopes.count > 0) {

            // If OpenID Connect (OIDC) is enabled,
            // - When "openid" is added to `scopes`, OIDC is applied.
            // - When "openid" is not added to `scopes`, OAuth 2.0 is applied. 
                                                
            // To use OIDC, add "openid" to `scopes`.
            // scopes.append("openid")

            throw SdkError(scopes:scopes)
        }
        else {
            return user
        }
    })
    .retry(when: Auth.shared.rx.incrementalAuthorizationRequired())
    .subscribe(onSuccess:{ ( user ) in
        print("me() success.")

        // Do something
        _ = user
        
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)

loginWithKakaoAccount() presents the Consent screen asking for consent to the requested scope. When a user chooses to provide the scope and selects [Accept and Continue] on the Consent screen, new tokens are issued, and the scope information is updated in the OAuthToken class.

Retrieve consent details

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Manage consent items
Required - iOS SDK
scopes()
ReactiveX iOS SDK
scopes()

This API enables you to retrieve the detailed information of the scopes (consent items) that a user has agreed to. You can check all scopes set in [My Application] > [Kakao Login] > [Consent Items] and the details of the scopes. If a user has consented to the scope before, the scope is included in the response even though your app is currently not using the scope.

Call the scopes() method in the UserApi class.

Parameter

Name Type Description Required
scopes [String] Used when you retrieve specific scopes only.
List of scope IDs you want to retrieve by referring to the IDs set in [My Application] > [Kakao Login] > [Consent Items].
X

Sample

Swift
RxSwift
UserApi.shared.scopes() { (scopeInfo, error) in
    if let error = error {
        self?.errorHandler(error: error)
    }
    else {
        self?.success(scopeInfo)
        
        // Do something
        _ = scopeInfo
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.scopes()
    .subscribe(onSuccess:{ (scopeInfo) in
        self.success(scopeInfo)
        
        // Do something
        _ = scopeInfo
                                    
    }, onFailure: {error in
        self.errorHandler(error: error)
    })
    .disposed(by: self.disposeBag)

You can also retrieve the information of specific scopes by passing scope IDs. In this case, the response includes only the detailed information of the specified scopes if the request is successful.

Swift
RxSwift
UserApi.shared.scopes(scopes: ["account_email","gender"]) { (scopeInfo, error) in
    if let error = error {
        self?.errorHandler(error: error)
    }
    else {
        self?.success(scopeInfo)
        
        // Do something
        _ = scopeInfo
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.scopes(scopes: ["account_email","gender"])
    .subscribe(onSuccess:{ (scopeInfo) in
        self.success(scopeInfo)
        
        // Do something
        _ = scopeInfo
                                    
    }, onFailure: {error in
        self.errorHandler(error: error)
    })
    .disposed(by: self.disposeBag)

If the request is successful, scopes() returns the ScopeInfo object that includes the details of each scope and whether a user has agreed to the scope.

ScopeInfo
Name Type Description Required
id Long Service user ID. O
scopes [Scope] List of scope information. X
Scope
Name Type Description Required
id String Scope ID. O
displayName String Name or description of the scope (consent item) displayed on the Consent screen. O
type ScopeType Enum class for Scope type.
- PRIVACY: scopes for Personal Information
- SERVICE: scopes for Permission
O
using Boolean Whether your app is using the scope.
true: Using the scope.
false: Not using the scope even though the user has agreed to.
O
agreed Boolean Whether the user has agreed to the scope.
true: The user has agreed.
false: The user has not agreed.
O
revocable Boolean Whether you can revoke this scope.
Only returned if the user has agreed to the scope.("agreed"=true)
true: Possible to revoke the scope.
false: Impossible to revoke the scope.
X

Revoke consent

Basic information
Permission Prerequisite Kakao Login User consent Reference
- Register platforms
Activate Kakao Login
Manage consent items
Required - iOS SDK
revokeScopes()
ReactiveX iOS SDK
revokeScopes()

This API revokes the scope that a user has agreed to. Call the revokeScopes() method in the UserApi class.

Parameter

Name Type Description Required
scopes [String] List of scope IDs you want to revoke.
You can revoke only the scope with "revocable":true among the scopes retrieved through the Retrieving consent details API. If you request to revoke the scope that is not revocable, an error is returned.
O

Sample

Swift
RxSwift
UserApi.shared.revokeScopes(scopes: ["account_email","gender"]) { (scopeInfo, error) in
    if let error = error {
        self?.errorHandler(error: error)
    }
    else {
        self?.success(scopeInfo)
        
        // Do something
        _ = scopeInfo
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.revokeScopes(scopes: ["account_email","gender"])
    .subscribe(onSuccess:{ (scopeInfo) in
        self.success(scopeInfo)
        
        // Do something
        _ = scopeInfo
                                    
    }, onFailure: {error in
        self.errorHandler(error: error)
    })
    .disposed(by: self.disposeBag)

If the request is successful, scopes() returns the ScopeInfo object that includes the details of each scope and whether a user has agreed to the scope.

Get consent to desired service terms

Basic information
Permission Prerequisite Kakao Login User consent Reference
Required Register platforms
Activate Kakao Login
Manage consent items
Advanced: Activate OpenID Connect(Optional)
Set Simple Signup
Required Required:
Required consent item
Common
isKakaoTalkLoginAvailable()
AuthFailureReason
iOS SDK
loginWithKakaoTalk()
loginWithKakaoAccount()
ReactiveX iOS SDK
loginWithKakaoTalk()
loginWithKakaoAccount()

Note

This API is only allowed for the service that adopted Kakao Sync. To see the advantages of Kakao Sync, refer to Concept > Kakao Sync. Before implementing this API, read Design terms and policies.

This API enables you to request consent to specific service terms that a user has not consented to, regardless of whether the user has already signed up.

If your app is used for multiple services and each service requires consent to different service terms, or if a new required service term is added to your service, you can use this API. For more details, Design service terms and policies.

To request consent to specific scopes from a user, pass the list of service term tags through serviceTerms as an argument when you call loginWithKakaoTalk() or loginWithKakaoAccount().

If you do not add serviceTerms when requesting an authorization code, the general Kakao Login API proceeds. In this case, you cannot request consent to the desired service terms. Also, if a user has already consented to all required service terms, the user is logged in without the Consent screen prompted. For more details, refer to FAQ.

Parameter

Name Type Description Required
serviceTerms [String] Tags for the service terms that are required to consent. O

Sample

Swift
RxSwift
// Add service_terms in a string format that includes all service terms separated by ‘,’
// ex) "tag1,tag2"
let serviceTerms = ["tag1", "tag2"]

UserApi.shared.loginWithKakaoAccount(serviceTerms: serviceTerms, completion: {(oauthToken, error) in
if let error = error {
        print(error)
    }
    else {
        print("loginWithKakaoAccount(serviceTerms:) success.")        
        // Do something
        _ = oauthToken
    }
})
// Class member property
let disposeBag = DisposeBag()

// Add service_terms in a string format that includes all service terms separated by ‘,’
//  ex) "tag1,tag2"
let serviceTerms = ["tag1", "tag2"]

UserApi.shared.rx.loginWithKakaoAccount(serviceTerms: serviceTerms)
    .subscribe(onNext: { (oauthToken) in
        print("loginWithKakaoAccount(serviceTerms:) success.")        
        // Do something
        _ = oauthToken
    }, onError: {error in
        print(error)
    })
.disposed(by: disposeBag)

The response is returned through the OAuthToken object in the same as the Kakao Login.

Retrieve consent details for service terms

Basic information
Permission Prerequisite Kakao Login User consent Reference
Required: Kakao Sync Register platforms
Activate Kakao Login
Manage consent items
Set Simple Signup
Required - iOS SDK
scopes()
ReactiveX iOS SDK
scopes()

Note

This API is only allowed for the service that adopted Kakao Sync. To see the advantages of Kakao Sync, refer to Concept > Kakao Sync.

This API enables you to check the service terms that a user has consented to. Call the serviceTerms() method defined in the UserApi class.

Parameter

Name Type Description Required
result String List of service terms to retrieve, use one of the followings.
agreed_service_terms: List of service terms users have agreed to (default)
app_service_terms: List of service terms enabled for the app
X
tags [String] Tags of service terms to retrieve, limited in the list specified by result. X

Sample

Swift
RxSwift
UserApi.shared.serviceTerms() { (userServiceTerms, error) in
    if let error = error {
        self?.errorHandler(error: error)
    }
    else {
        self?.success(userServiceTerms)
        
        //do something
        _ = userServiceTerms
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.serviceTerms()
    .subscribe(onSuccess:{ (userServiceTerms) in
        self.success(userServiceTerms)
        
        //do something
        _ = userServiceTerms
                                    
    }, onFailure: {error in
        self.errorHandler(error: error)
    })
    .disposed(by: self.disposeBag)

serviceTerms() returns the UserServiceTerms object.

UserServiceTerms
Name Type Description Required
id Long Service user ID. O
serviceTerms [ServiceTerms] List of service terms. X
ServiceTerms
Name Type Description Required
tag String Tags set in the service terms. O
required Boolean Whether consent is required in the service terms. O
agreed Boolean The consent status of the service terms.
true: Agreed
false: Disagreed
O
revocable Boolean Whether consent is revocable in the service terms.
true: Can be revoked
false: Cannot be revoked, is in a disagreed state or is a required Term of Service

Note: Only service terms with revocable consent are available for Revoke consent for service terms API requests.
O
agreedAt Datetime The last time user agreed to the service terms.
(RFC3339 internet date/time format)
X

Revoke consent for service terms

Basic information
Permission Prerequisite Kakao Login User consent Reference
Required: Kakao Sync Register platforms
Activate Kakao Login
Manage consent items
Set Simple Signup
Required - Common
RevokedServiceTerms
UserRevokedServiceTerms
iOS SDK
revokeServiceTerms()
ReactiveX iOS SDK
revokeServiceTerms()
Note

This API is only allowed for the service that adopted Kakao Sync.

Revoke a service terms that a specific user has agreed to. Only service terms with a revocable value of true in the Retrieving consent details for service terms response can be revoked.

Call the revokeServiceTerms() method defined in the UserApi class. Specify the tags of the service terms you want to revoke consent for in tags.

Parameter

Name Type Description Required
tags [String] Service terms tags to revoke.

Note: Only service terms with a revocable value of true in the Retrieving consent details for service terms response can be revoked.
O

Sample

Swift
RxSwift
UserApi.shared.revokeServiceTerms(tags: ["test_tag1","test_tag2"]) { (userRevokedServiceTerms, error) in
    if let error = error {
        self?.errorHandler(error: error)
    }
    else {
        self?.success(userRevokedServiceTerms)
        
        //do something
        _ = userRevokedServiceTerms
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.revokeServiceTerms(tags: ["test_tag1", "test_tag2"])
    .subscribe(onSuccess:{ (userRevokedServiceTerms) in
        self.success(userRevokedServiceTerms)
        
        //do something
        _ = userRevokedServiceTerms
                                    
    }, onFailure: {error in
        self.errorHandler(error: error)
    })
    .disposed(by: self.disposeBag)

revokeServiceTerms() returns the UserRevokedServiceTerms object.

UserRevokedServiceTerms
Name Type Description Required
id Long Service user ID. O
revokedServiceTerms [RevokedServiceTerms] List of revoked service terms

Note: User non-consent or required service terms that cannot be revoked are not included.
X
RevokedServiceTerms
Name Type Description Required
tag String Tag of revoked service terms O
agreed Boolean The consent status of the service terms after revocation.
true: Agreed
false: Disagreed
O

Advanced: Manual signup

Basic information
Permission Prerequisite Kakao Login User consent Reference
Required Register platforms
Activate Kakao Login
Required - iOS SDK
signup()
ReactiveX iOS SDK
signup()

Note

The Manual signup API is only for the app with the Auto-link option disabled. Before using this API, check out when to use this API and the cautions in REST API.

The Manual signup API manually links a user with your app to complete signup when the Auto-link is disabled.

To figure out if the currently logged-in user needs to be linked with your app, check the value of hasSignedUp in the response of the Retrieving user information API and handle each case:

  • true: The user is already linked with your app. You do not need to call the Manual signup API.
  • false: The user is not linked with your app. You must call signup() to link the user with your app manually.
  • nil: Your app is using the Auto-link feature. You do not need to call the Manual signup API.

If the return value of hasSignedUp is false and the user is ready to sign up, call the signup() method to complete the signup.

Parameter

Name Type Description Required
properties [String:String] A list of user information.
Used when you want to store user information needed for your service when linking a user.
Refer to Manage user properties.
X

Sample

Swift
RxSwift
UserApi.shared.signup { (userId, error) in
    if let error = error {
        print(error)
    }
    else {
        print("signup() success.")
    }
}
// Class member property
let disposeBag = DisposeBag()

UserApi.shared.rx.signup()
    .subscribe (onSuccess:{ (userId) in
        print("signup() success.")        
    }, onFailure: {error in
        print(error)
    })
    .disposed(by: disposeBag)

If the request is successful, the user's service ID is returned.

To check the request result, request the Retrieving user information API again and check the value of hasSignedUp because the user's linked status is not provided even when the request is successful.

See more