Облачное хранилище Google — ограничить токен доступа одним сегментом

#token #google-cloud-storage #bucket

#токен #google-облачное хранилище #сегмент

Вопрос:

У меня есть серверное приложение, которое хранит пользовательские файлы в облачном хранилище Google. Клиенты запрашивают файлы с сервера, и он возвращает URL-адрес, который указывает на файл в облачном хранилище Google. Сервер также возвращает токен доступа, чтобы клиент мог загрузить файл.

Я обнаружил, что токен доступа, который генерирует мой сервер, можно использовать для загрузки любого файла, который я сохранил в облачном хранилище Google. Я бы предпочел сгенерировать токен доступа, который действителен только для одного сегмента. Возможно ли это? Является ли это правильным подходом для ограничения доступа клиентов к хранилищу?

Вот как я генерирую токен доступа:

 private Credential authorize (Set<String> scopes)
{
    GoogleCredential credential = null;

    try
    {
        if (m_HttpTransport == null)
        {
            m_HttpTransport = GoogleNetHttpTransport.newTrustedTransport ();
        }

        File p12File = new File ("key.p12");

        credential = new GoogleCredential.Builder ()
                           .setTransport (m_HttpTransport)
                           .setJsonFactory (JacksonFactory.getDefaultInstance ())
                           .setServiceAccountId ("foo@developer.gserviceaccount.com")
                           .setServiceAccountScopes (scopes)
                           .setServiceAccountPrivateKeyFromP12File (p12File).build ();
    }
    catch (Exception ex)
    {
        m_Logger.log (Level.SEVERE, null, ex);
    }

    return credential;
}

private String retrieveReadOnlyAccessToken ()
        throws IOException
{
    Set<String> scopes = new HashSet<> ();

    scopes.add (StorageScopes.DEVSTORAGE_READ_ONLY);

    Credential credential = authorize (scopes);

    credential.refreshToken ();

    return credential.getAccessToken ();
}
  

Ответ №1:

Для вашего варианта использования (ограниченный доступ к ресурсу) Я бы предложил использовать подписанные URL-адреса. Смотрите Документацию здесь .

Типичный способ решения этой проблемы — предоставить пользователю подписанный URL-адрес, который позволяет пользователю получать доступ к этому ресурсу в течение ограниченного времени. Любой, кто знает URL, может получить доступ к ресурсу в течение ограниченного времени.

В случае подписанных URL-адресов вашим пользователям даже не нужно иметь учетную запись Google для чтения / записи / удаления ресурсов GCS, а управление доступом полностью осуществляется вашим приложением.

Комментарии:

1. Просто переопределил мое решение с подписанными URL-адресами, и оно работает. Спасибо!