Firebase Authentication 란?
Firebase 에서 사용자 관리를 편리하게 하기 위한 기능으로, 사용자 계정 추가, 삭제, 중지 등 다양한 기능을 제공한다.
여기서 제공되는 로그인 방식으로는
- 이메일/비밀번호
- 전화
- Google Account
- GitHub
- 익명
이렇게 7가지가 제공된다. 위 리스트들은 기본적으로 제공되는 인증 방식일 뿐 Firebase Authentication은 어떠한 Custom 인증 시스템도 연동할 수 있다.
1. Kakao Login을 이용하여 Custom 인증 시스템 연동 방법
https://github.com/firebase/custom-auth-samples/tree/master/kakao
해당 주소에 가보면 자세한 설정 방법이 나와있어 그대로 따라하면 된다.
Kakao Custom 인증을 위해서는 서버측에서 Kakao Login 정보를 이용하여 Firebase Token을 생성해야한다.
1) Node.js 기반 서버를 구축한다. 기본적인 세팅방법은 http://nextus.tistory.com/8 참조.
2) 구축된 Node.js 서버에 다음과 같은 패키지들을 설치해야 한다. ( require, require-promise, firebase-admin )
sudo npm Install require require-promise firebase-admin --save
3) 아래 코드를 server.js 파일에 붙여넣기 한다.
// import necessary modules | |
const express = require('express'); | |
const bodyParser = require('body-parser'); | |
const request = require('request-promise'); | |
// Firebase setup | |
const firebaseAdmin = require('firebase-admin'); | |
// you should manually put your service-account.json in the same folder app.js | |
// is located at. | |
const serviceAccount = require('./service-account.json'); | |
// Kakao API request url to retrieve user profile based on access token | |
const requestMeUrl = 'https://kapi.kakao.com/v1/user/me'; | |
// Initialize FirebaseApp with service-account.json | |
firebaseAdmin.initializeApp({ | |
credential: firebaseAdmin.credential.cert(serviceAccount), | |
}); | |
/** | |
* requestMe - Returns user profile from Kakao API | |
* | |
* @param {String} kakaoAccessToken Access token retrieved by Kakao Login API | |
* @return {Promiise<Response>} User profile response in a promise | |
*/ | |
function requestMe(kakaoAccessToken) { | |
console.log('Requesting user profile from Kakao API server.'); | |
return request({ | |
method: 'GET', | |
headers: {'Authorization': 'Bearer ' + kakaoAccessToken}, | |
url: requestMeUrl, | |
}); | |
}; | |
/** | |
* updateOrCreateUser - Update Firebase user with the give email, create if | |
* none exists. | |
* | |
* @param {String} userId user id per app | |
* @param {String} email user's email address | |
* @param {String} displayName user | |
* @param {String} photoURL profile photo url | |
* @return {Prommise<UserRecord>} Firebase user record in a promise | |
*/ | |
function updateOrCreateUser(userId, email, displayName, photoURL) { | |
console.log('updating or creating a firebase user'); | |
const updateParams = { | |
provider: 'KAKAO', | |
displayName: displayName, | |
photoURL: photoURL, | |
}; | |
if (photoURL) { | |
updateParams['photoURL'] = photoURL; | |
} | |
return firebaseAdmin.auth().updateUser(userId, updateParams) | |
.catch((error) => { | |
if (error.code === 'auth/user-not-found') { | |
updateParams['uid'] = userId; | |
if (email) { | |
updateParams['email'] = email; | |
} | |
return firebaseAdmin.auth().createUser(updateParams); | |
} | |
throw error; | |
}); | |
}; | |
/** | |
* createFirebaseToken - returns Firebase token using Firebase Admin SDK | |
* | |
* @param {String} kakaoAccessToken access token from Kakao Login API | |
* @return {Promise<String>} Firebase token in a promise | |
*/ | |
function createFirebaseToken(kakaoAccessToken) { | |
return requestMe(kakaoAccessToken).then((response) => { | |
const body = JSON.parse(response); | |
const userId = `kakao:${body.id}`; | |
if (!userId) { | |
return res.status(404) | |
.send({message: 'There was no user with the given access token.'}); | |
} | |
return updateOrCreateUser(userId, body.kaccount_email, | |
body.properties.nickname, body.properties.profile_image); | |
}).then((userRecord) => { | |
const userId = userRecord.uid; | |
console.log(`creating a custom firebase token based on uid ${userId}`); | |
return firebaseAdmin.auth().createCustomToken(userId, {provider: 'KAKAO'}); | |
}); | |
}; | |
// create an express app and use json body parser | |
const app = express(); | |
app.use(bodyParser.json()); | |
// default root url to test if the server is up | |
app.get('/', (req, res) => res.status(200) | |
.send('KakaoLoginServer for Firebase is up and running!')); | |
// actual endpoint that creates a firebase token with Kakao access token | |
app.post('/verifyToken', (req, res) => { | |
const token = req.body.token; | |
if (!token) return res.status(400) | |
.send({message: 'Access token is a required parameter.'}); | |
createFirebaseToken(token).then((firebaseToken) => { | |
console.log(`Returning firebase token to user: ${firebaseToken}`); | |
res.send({firebase_token: firebaseToken}); | |
}); | |
}); | |
// Start the server | |
const server = app.listen(process.env.PORT || '8000', () => { | |
console.log('KakaoLoginServer for Firebase listening on port %s', | |
server.address().port); | |
}); |
4) 자신의 Firebase console -> 해당 프로젝트 -> 설정 -> 서비스계정 항목으로 가서 '새 비공개 키 생성' 버튼을 눌러 키파일을 받아 server.js 파일의 동일 위치에 집어넣는다.
5) Android 에서 Git page에 나온 샘플 소스대로 구축하면 끝