[firebase] getSignedUrl 관련 이슈

효택·2021년 5월 10일
0

이전 포스팅에 작성했듯이 img를 storage에 업로드 하는 작업을 완료했다.
그렇다면 프론트에서 사용할 수 있게 URL을 넘겨줘야 하는데 어떻게 넘겨주는가!

getSignedUrl

관련 레퍼런스를 찾아서 getSignedUrl을 통해 매개변수로 path를 주면 url을 받을 수 있다는 것을 알아냈다.

    
    const config: GetSignedUrlConfig = {
      action: "read",
      expires: "12-18-2030",
    };
    const file = storage.bucket().file(`${folder}/${uid}/${fileName}`);

    file.getSignedUrl(config, (err, url) => {
      if (err) rejects(err);
      resolve(url);
    });

야심차게 돌린 코드에선 에러가 나왔다... 절망... "Cannot sign data without client_email" for getSignedUrl

왜 안되지... 스택오버플로우랑 깃헙에서 열심히 찾아본 결과 getSignedUrl 함수를 실행할 때, 내 storage에 대한 인증이 없어서 저런 충돌이 생긴거였다.

아니?

근데?

왜?

업로드는 정상적으로 되고!!

해결책

정말 이틀 밤을 새면서 힘든 시간을 보냈다. 그러다 한 스택오버플로우에서 짜릿한 답변을 하나 봤다.

원래 기존 답변은 4년 전꺼라 예전 gcp에 키 json을 달아서 사용하는건데, 나는 firebase admin으로 사용하고 싶었다. 근데 그 답변의 update라는 표시로 admin을 활용하는 방법 또한 나와있었다..!!

순간 심장일 벌렁벌렁 거리면서 링크를 타고 들어갔고, admin을 initializeApp에서 객체로

admin.initializeApp({
  credential: admin.credential.cert(require("../Config/serviceAccountKey")),
  storageBucket: "<>.appspot.com",
});

이런식으로 추가하면 인증 문제가 해결이 된다고 한다!

여기서 두 번째 문제 발생!

credential에 sdk key를 인자로 넣어줘야하는데 기존 firebase 문서에 있는 함수를 활용하면 경로에 파일이 존재하지 않아서 오류가 난다.

그래서 나는 파이어베이스 설정에서 sdk key json을 발급 받고, 넣어주었다.

그 결과 getSingedUrl이 정상적으로 작동했다.


그리고 별개의 방법을 뒤늦게 알았다.

getSingedUrl은 키 인증때문에 expire를 오래 늘려도 7일이 최대다. 그래서 더 긴 url을 만들기 위해 방법을 찾다가, 같은 팀 형이 알려준 방법이 있다.

아예 storage를 public으로 바꿔서 path를 활용한 다운로드 링크를 만드는 것이다... 이러면 유효일자도 신경 안쓰고 할 수 있다...!

https://storage.googleapis.com/{storage path}/{path} 이런 식으로!!


업로드보다 스트레스를 곱절을 받았던 개발이었다... 근데 진짜 다운로드 url 성공하고 내 이미지 보는 순간 울뻔...

다들 포기하지 말고 홧팅

profile
택택 be Developer

0개의 댓글