import crypto from '../lib/CryptoJS'
import { localStorage } from '../util'
import { getAppKey as _getAppKey } from '../common'
/**
* @function getAppKey
* @return {String} 사용중인 App Key
* @memberof Kakao.Auth
*/
export function getAppKey() {
return _getAppKey()
}
let accessToken = null
/**
* @function getAccessToken
* @return {String} 사용 중인 액세스 토큰
* @memberof Kakao.Auth
*/
export function getAccessToken() {
if (accessToken === null) {
accessToken = retrieveItem(getAccessTokenKey())
}
return accessToken
}
/**
* API 호출 시 사용할 액세스 토큰을 설정합니다.
* @function setAccessToken
* @param {String} token 사용할 액세스 토큰
* @param {Boolean} [persist=true] 세션이 종료된 뒤에도 액세스 토큰을 사용할 수 있도록 로컬 스토리지 저장 여부
* @memberof Kakao.Auth
*/
export function setAccessToken(token, persist = true) {
accessToken = token
if (token === null || persist === false) {
// EXPLICITLY REQUESTED NON-PERSISTANCE
removeItem(getAccessTokenKey())
} else {
storeItem(getAccessTokenKey(), token)
}
}
/**
* @function getRefreshToken
* @deprecated 이 API는 보안 정책으로 인해 폐기되었습니다.
* @memberof Kakao.Auth
*/
export function getRefreshToken() {
console.error('unsupported operation: Auth.getRefreshToken()')
return ''
}
/**
* @function setRefreshToken
* @deprecated 이 API는 보안 정책으로 인해 폐기되었습니다.
* @memberof Kakao.Auth
*/
export function setRefreshToken(token) {
console.error('unsupported operation: Auth.setRefreshToken()')
}
function storeItem(key, value) {
const item = encrypt(value, getAppKey())
localStorage.setItem(key, item)
}
function retrieveItem(key) {
const item = localStorage.getItem(key)
return item ? decrypt(item, getAppKey()) : null
}
function removeItem(key) {
localStorage.removeItem(key)
}
// CACHE TOKEN STORAGE KEYS
const tokenStorageKeys = {}
function getAccessTokenKey() {
if (!tokenStorageKeys.accessTokenKey) {
tokenStorageKeys.accessTokenKey = 'kakao_' + hash('kat' + getAppKey())
}
return tokenStorageKeys.accessTokenKey
}
function hash(msg) {
return crypto.MD5(msg).toString()
}
function encrypt(msg, passphrase) {
return crypto.AES.encrypt(msg, passphrase).toString()
}
function decrypt(encrypted, passphrase) {
return crypto.AES.decrypt(encrypted, passphrase).toString(crypto.enc.Utf8)
}