2016-12-04 1 views
0

url 및 사용자 정의 액세스 토큰을 사용하여 액세스 보호 된 이미지를 다운로드 할 때 문제가 있습니다.Firebase 저장소 : http url 경로 및 맞춤 액세스 토큰을 사용하여 액세스 보호 된 이미지 다운로드

인증 오류 :

{ 
    "error": { 
     "code": 403, 
     "message": "Permission denied. Could not perform this operation" 
    } 
} 

내가 놓친 몇 가지 구성이 있습니까?

I 쿼리 매개 변수로 정의 토큰 갖는 이미지에 액세스하는 데 사용하고

의 HTTP URL :

https://myfirebasestorage.googleapis.com/v0/b/myfirebasestorage-my_proj_id.appspot.com/o/images%2FIMG_4138.JPG?alt=media&token=TOKEN_GOT_USING_CREATE_CUSTOM_TOKEN_SIGN_IN 

내 저장 규칙 :

service firebase.storage { 
    match /b/myfirebasestorage-my_proj_id.appspot.com/o { 
    match /{allPaths=**} { 
     allow read: if request.auth != null; 
    } 
    } 
} 

사용자 정의 토큰은 다음과 같이 자바 응용 프로그램에서 생성됩니다

public static String createCustomToken(String userId, Map<String, Object> additionalClaims) { 
    FirebaseOptions options = new FirebaseOptions.Builder() 
     .setServiceAccount(new FileInputStream(FIREBASE_ACCESS_FILE)).build(); 
    FirebaseApp.initializeApp(options); 

    Task<String> customToken = FirebaseAuth.getInstance().createCustomToken(userId, additionalClaims); 
    return customToken.getResult().toString(); 
    } 

동일한 토큰의 진위 여부를 확인할 수 있습니다. . FirebaseAuth.getInstance() verifyIdToken (idToken)와 로그 출력을 사용하여 자바 응용 프로그램에서 다음과 같습니다 :

VerifiedToken=>uid: user_id_1, 
email: [email protected], 
additionalClaims: { 
    "aud": "myfirebasestorage-<my_proj_id>", 
    "auth_time": 1480609782, 
    "email": "[email protected]", 
    "email_verified": false, 
    "exp": 1480621773, 
    "iat": 1480618173, 
    "iss": "https://securetoken.google.com/myfirebasestorage-my_proj_id", 
    "sub": "user_id_1", 
    "circleId": "circle_id_1", 
    "memberId": "user_id_1", 
    "user_id": "user_id_1", 
    "firebase": { 
    "identities": { 

    }, 
    "sign_in_provider": "custom” 
    } 
} 

서명 된 웹 클라이언트 코드에서이 사용자 정의 토큰 후, 아래와 같이 올바른 응답을 볼 수 있습니다

{ 
    "uid": "user_id_1", 
    "displayName": null, 
    "photoURL": null, 
    "email": null, 
    "emailVerified": false, 
    "isAnonymous": false, 
    "providerData": [], 
    "apiKey": "API_KEY", 
    "appName": "[DEFAULT]", 
    "authDomain": "myfirebasestorage-<my_proj_id>.firebaseapp.com", 
    "stsTokenManager": { 
    "apiKey": "API_KEY", 
    "refreshToken": "REFRESH_TOKEN_FROM_FIREBASE", 
    "accessToken": "ACCESS_TOKEN_FROM_FIREBASE", 
    "expirationTime": 1480621773681 
    }, 
    "redirectEventId": null 
} 

참고 : 나는 토큰 아래와 같은 정의를 사용하여 중포 기지 데이터베이스에 노드를 액세스 할 수있게되었습니다.

https://myfirebasestorage-my_proj_id.firebaseio.com/games/basic_info.json?orderBy=%22owner_id%22&limitToFirst=30&auth=ACCESS_TOKEN_FROM_FIREBASE 

내 데이터베이스 규칙

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

답변

2

짧은 대답은 ?token=<UUID> 것을 Storage?auth=<Firebase Auth JWT or Database Secret>Realtime Database 그 용도 (따라서 자신의 다른 이름)과 동일하지 않습니다 사용한다는 것입니다.

Storage는 Firebase 인증을 사용하지 않는 사용자와 공유하도록 설계된 https://myfirebasestorage.googleapis.com/v0/b/<BUCKET>/o/<OBJECT>?alt=media&token=<UNGUESSABLE_UUID> 형식의 추측 할 수없는 다운로드 URL을 제공합니다 (가족/친구와 사진을 공유한다고 상상하지만 앱을 다운로드하지 않으려는 경우). 그것을하기 위해). 당신이 저장 보안 규칙에 의해 보호 다운로드를 원한다면

, 당신은 getBytes(), getStream, getFile()per the docs의 네이티브 안드로이드 방법을 사용해야합니다.

+0

이 페이지에서 "사용자 개인"또는 "그룹 개인"이라는 제목으로 언급 한 Firebase 데이터베이스뿐만 아니라 Firebase 저장소에도 토큰이 적용될 수 있다고 생각했습니다. 한번 봐주세요. https://firebase.google.com/docs/storage/security/user-security 기억 장치는 사용자가 직접 firebase 콘솔에서 검색 할 수도있는 이해할 수없는 다운로드 URL을 제공합니다.> 객체 속성 -> "다운로드 URL" . 문제는 누군가가 다운로드 URL을 알 자마자 사용자 기반 액세스 보호와 같은 것이 없습니다. 누구나 내용을 볼 수 있으므로 보안 방법이 없습니다 – Philonoist

+0

내 사용 사례는 다음과 같습니다.> 내 친구 그룹에있는 한 내 비디오를 나와 공유하십시오.일단 당신이 내 친구 그룹을 떠나면, 나는 당신과 어떤 것을 공유하고 같은 그룹의 다른 친구에게만 내용을 제한하고 싶지 않을 것입니다. 하지만이 경우에는 더 이상 내 친구 그룹에 속하지 않아도 이미 비디오 URL을 얻었으므로 해당 비디오에 계속 액세스 할 수 있습니다. – Philonoist

관련 문제