서론
이번에는 앱 관리를 위해서 Laravel에 Firebase realtime database를 연동해 보도록 하겠습니다.
먼저, 구글 계정으로 로그인 해 주신 뒤, 파이어베이스 프로젝트를 생성해 줍니다.
Firebase Setting
파이어베이스 프로젝트를 생성 후,
왼쪽 위에 톱니바퀴 아이콘을 클릭 해 주신 다음
프로젝트 설정 -> 서비스 계정 -> 서비스 계정 만들기를 클릭해 줍니다.
그러면, 새 비공개 키 생성 버튼이 활성화 되게 되는데, 해당 버튼을 클릭 후
키 생성 버튼을 눌러주셔서 json 파일을 다운로드 받아 주세요.
그 다음 Realtime Database를 생성해 줍니다.
왼쪽 메뉴에서 빌드->Realtime Database를 선택하여 데이터 베이스를 생성해 주세요.
잠금모드로 시작합니다.
그 다음 필요한 데이터를 일부 세팅해 줍니다.
Realtime database에서 규칙으로 들어가 규칙을 다음과같이 설정해 줍니다.
모든 디바이스에서 해당 값을 읽어줘야 하기 때문에 .read는 true로,
.write는 아래와 같이 수정해 주세요.
{
"rules": {
".read": true,
".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
}
}
이제 Firebase 세팅은 완료 되었습니다.
Laravel과 Firebase를 연동하여 값을 읽고, 수정해 보도록 하겠습니다.
Laravel + Firebase 연동
먼저, laravel에 firebase를 연동하기 위해서는 sodium 을 확장해 줘야 합니다.
apt install php-sodium
window의 경우에는 php.ini extension 에서 sodium을 extension 해 줍시다!
그 후, kreait/laravel-firebase 를 composer를 이용하여 설치해 줍니다.
composer require kreait/laravel-firebase
만약 설치시 오류가 나온다면 composer.lock 파일을 삭제 후 시도해 주세요.
위 라이브러리의 자세한 내용은 아래 링크를 참조해 주세요.
config/app의 providers에 아래 내용을 추가해 줍니다!
<?php
// config/app.php
return [
// ...
'providers' => [
// ...
Kreait\Laravel\Firebase\ServiceProvider::class
]
// ...
];
추가로, Realtime Database의 Document는 아래 링크를 참조해 주세요.
아까 파이어베이스에서 받은 json 파일을 storage 안에 저장해 준 뒤
그 후, env 파일에 아래와 같은 내용을 추가해 줍니다.
FIREBASE_CREDENTIALS=storage/json_file_path
FIREBASE_DATABASE_URL=https://[project-name]-default-rtdb.firebaseio.com
이제 파이어 베이스와 연동할 컨트롤러를 하나 생성해 줍니다.
php artisan make:controller Firebase/FirebaseController
FirebaseController 안쪽에 코드는 아래와 같이 작성해 보도록 하겠습니다.
<?php
namespace App\Http\Controllers\Firebase;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Kreait\Firebase\Contract\Database;
use Illuminate\Support\Facades\Validator;
class FirebaseController extends Controller
{
public function __construct(Database $database)
{
$this->database = $database;
}
public function getDeviceFirebaseInfo($device) {
if($device !== "android" && $device !== "ios") {
$response = ["message" => "device value is only android or ios.", "code"=>400];
return response($response, 400);
}
$reference = $this->database->getReference($device);
return $reference->getValue();
}
// 완료
public function setAppFirebaseInfo(Request $request) {
$validator = [
'device'=>'required|string',
'key'=> 'required|string',
'value'=>'required'
];
$validatorCheck = Validator::make($request->all(), $validator);
if($validatorCheck->fails()) {
$response = ["message" => $validatorCheck->errors()->all(), "code"=>400];
return response($response, 400);
}
if($request->device !== "android" && $request->device !== "ios") {
$response = ["message" => "device value is only android or ios.", "code"=>400];
return response($response, 400);
}
// 해당 디바이스에 해당 값 있는지 확인
$reference = $this->database->getReference($request->device);
$snapshot = $reference->getSnapshot();
// 해당 키 값 있는지 확인
if($snapshot->hasChild($request->key)) {
$snapshot->getChild($request->key)->getReference()->set($request->value);
return $reference->getValue();
} else {
return response(["message"=>"The ".$request->device." do not have ". $request->key.".", "code"=>400], 400);
}
}
}
라우트를 적절히 코딩하신 후, POSTMAN을 이용하여 확인해 보았습니다.
정상적으로 연동 되었음을 확인 하실 수 있습니다.
추가적으로, Firebase와의 연동테스트를 진행하기 위해서는 https 인증이 필요하기 때문에
php artisan serve로 서버를 실행시키면 테스트가 불가능 합니다.
반드시 xampp 등으로 서버를 세팅 해 주신 후에 테스트 진행 해 주세요!
'Programming' 카테고리의 다른 글
[AWS] ACM + Route53을 이용한 SSL(Https) 인증서 발급 (8) | 2022.05.04 |
---|---|
laravel.log could not be opened in append mode: failed to o pen stream: Permission denied (0) | 2022.05.03 |
AWS S3 private + IAM + CloudFront로 보안을 첨가한 파일 업로드 구현 (0) | 2022.04.26 |
npm install시 npm ERR! code ERESOLVE 오류 해결 (0) | 2022.04.21 |
CKEditor5 - Web Editor CKEditor5 이미지 업로드(For jQuery) (5) | 2022.04.15 |