내가 헤매서 쓰는 Firebase <-> Nodejs 연동
서버/nodejs

내가 헤매서 쓰는 Firebase <-> Nodejs 연동

작성 배경

해당 사항이 필요했던 이유는 프로젝트를 진행함에 있어서, App에서 Google 로그인을 하기 위해 Firebase를 사용했고, 토큰(사용자UID)를 서버(nodejs)에서 디코드 하여 "email"값으로 사용자를 구분해야만 했다.

문제를 해결하기 위해서 "구글 클라우드 플랫폼"을 사용해도 됐지만, 협업을 위해 Firebase로 진행하였다.

하지만 자료가 많이 없었고, 공식문서를 참고하여도 쉽게 해결되지 않았기 때문에 기록으로 남긴다.

 

설명

1번째 글에서는 firebase와 nodejs를 연동시키는 것 부터 서술하겠다.

 

준비 :Firebase Console 제작. Firebase Console에 대한 설명은 후에 따로 글로 작성할 예정이다. (필자는 먼저 해둠)

 

01. $ npm install firebase-admin --save

- Firebase Admin Node.js SDK는 npm으로 제공된다. npm 패키지를 설치한다.

 

02. Firebase Console에서 설정 > 서비스 계정을 연다

03. "새 비공개 키 생성"을 클릭한 다음 "키 생성"을 클릭하여 확인한다

04. 키가 들어 있는 JSON 파일을 저장한다. (node 프로젝트 내부에 넣는다.)

- 서비스 계정의 비공개 키 파일을 생성하는 것 이다.

 

05. 코드 작성 (본인은 /middle/index.js 에 작성함)

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

serviceAccount를 선언할 때, path/to/....json 에는 본인이 다운로드 받은 JSON 파일의 경로와 이름을 넣어준다.

 

실제 작성 코드

 

이것으로 Firebase와 nodejs간의 "연결 통로" 정도 만들어졌다.

 

firebase와 nodejs 간 통로를 만들어주었으니, 그 통로로 uid를 주고, 그를 서버에서 디코드 해보겠다.

 

필자의 프로젝트 시나리오는 이렇다. 

Firebase를 사용해 google 계정으로 로그인 했을 때, 토큰이 발급되는데, APP에서 UID를 추출하고, 그 추출한 UID를 서버로 보낸다. 서버에서는 UID를 디코드 하여 출력한다.

왜 이런 비효율적인 방식을 사용하는지는, 라즈베리파이에 토큰을 넘겨야 했기 때문이다. 자세한 설명은 생략하겠다.

 

 

06. 전에 Firebase를 사용한 google 로그인 기능을 구현해 둔 APP을 사용하여 Firebase에 데이터를 하나 추가하였다.

Firebase Authentication

 

07. /middle/auth.js 파일을 생성하여 코드를 작성한다.

 

08. var admin = require('../middle/index');

- 먼저 05번에서 firebase 설정을 해준 index.js 파일을 import한다.

 

09.  "admin.auth().getUser(받아온 uid)"

- getUser의 파라미터로 들어가는 uid를 디코드 하는 함수이다. 이 함수를 사용하여 디코드를 진행한다.

 

const uid = req.header('Authorization');	// 후에 사용자 인증으로 사용할 값이라 헤더에 넣어준다

const userInfo = await admin.auth().getUser(uid);

req.currentUser = userInfo.email;		// email에 대한 항목만을 가져온다

 

참고 링크

firebase.google.com/docs/admin/setup?hl=ko#node.js_1

 

서버에 Firebase Admin SDK 추가

Admin SDK는 권한이 있는 환경에서 Firebase와 상호작용하여 다음과 같은 작업을 수행할 수 있는 서버 라이브러리 집합입니다. 전체 관리자 권한으로 실시간 데이터베이스 데이터를 읽고 씁니다. Fire

firebase.google.com

firebase.google.com/docs/auth/admin/verify-id-tokens#node.js

 

ID 토큰 확인  |  Firebase

Firebase 클라이언트 앱이 커스텀 백엔드 서버와 통신하는 경우 서버에 현재 로그인한 사용자를 식별해야 할 수 있습니다. 사용자를 안전하게 식별하려면 로그인이 정상적으로 이루어진 후에 HTTPS

firebase.google.com