2016-07-14 3 views
0

Я пытаюсь загрузить изображение в облако Google облако из моего веб-приложения AngularJS и сделать то же самое мне нужен код доступа, который должен быть помещен в заголовок Авторизация при запросе загрузки. Чтобы получить токен доступа, я представил конечную точку на стороне сервера, которая разработана в JAVA. Мой текущий код для доступа к токену такой:Как получить код доступа для Google Cloud Storage?

GoogleCredential credential = GoogleCredential.fromStream(new URL("HERE GOES URL OF MY SERVICE ACCOUNT JSON FILE").openStream()); 
if (credential.createScopedRequired()) { 
     Collection<String> scopes = StorageScopes.all(); 
     credential = credential.createScoped(scopes); 
    } 
String token = credential.getAccessToken(); 
log.log(Level.SEVERE, "5 "+token); 

Но в журналах я получаю null.

Почему я получаю JSON-файл из URL-адреса, потому что, когда я помещал JSON-файл в тот же пакет, он поднимал java.security.AccessControlException. Поэтому, чтобы избежать этого, я поместил файл на Google Drive и создал ссылку прямой загрузки, которая используется в приведенном выше коде.

Я просто хочу получить код доступа и отправить его в веб-приложение, чтобы можно было начать загрузку. Любая помощь будет оценена по достоинству.

Спасибо

+0

Что вы пытаетесь сделать с доступом лексема напрямую? Большинство библиотек, которые используют GCS из App Engine, автоматически контролируют авторизацию в качестве учетной записи службы движка приложения. –

+0

@BrandonYarbrough Я пытаюсь загрузить изображение в GCS, используя мое веб-приложение, встроенное в angularJS, и для достижения того же мне нужно отправить токен доступа в заголовок авторизации. –

+1

А, вы отправляете токен доступа на клиентскую сторону, а затем используете ли этот токен для выполнения загрузки? Если это так, я настоятельно рекомендую вам использовать другой подход, например, подписанные URL-адреса. Маркер доступа представляет FULL-права для того, чтобы сделать что-то, что может сделать учетная запись службы с этой областью. Например, вредоносный клиент может удалить ведро и все его содержимое. –

ответ

0

я в состоянии получить учетные данные с помощью следующий класс.

package XXXXXXXXXXXX; 

import java.io.IOException; 
import java.net.URL; 
import java.security.GeneralSecurityException; 
import java.util.Collection; 

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.storage.Storage; 
import com.google.api.services.storage.StorageScopes; 

//@author Umesh Chauhan 

public class StorageFactory 
{ 

    private static Storage instance = null; 

    public static synchronized Storage getService() throws IOException, GeneralSecurityException 
    { 
     if (instance == null) 
     { 
      instance = buildService(); 
     } 
     return instance; 
    } 

    private static Storage buildService() throws IOException, GeneralSecurityException 
    { 

     HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport(); 
     JsonFactory jsonFactory = new JacksonFactory(); 

     GoogleCredential credential = GoogleCredential.fromStream (
       new URL ("HERE GOES THE URL FOR YOUR SERVICE ACCOUNT JSON - I USED GOOGLE DRIVE DIRECT DOWNLOAD LINK TO MY JSON FILE") 
         .openStream()); 

     // Depending on the environment that provides the default credentials 
     // (for 
     // example: Compute Engine, App Engine), the credentials may require us 
     // to 
     // specify the scopes we need explicitly. Check for this case, and 
     // inject 
     // the Cloud Storage scope if required. 
     if (credential.createScopedRequired()) 
     { 
      Collection<String> scopes = StorageScopes.all(); 
      credential = credential.createScoped (scopes); 
     } 

     return new Storage.Builder (transport, jsonFactory, credential).setApplicationName ("YOUR PROJECT NAME").build(); 
    } 
} 

и дополнительно использовал этот объект хранения для загрузки в Google Cloud Storage.

Если какой-либо один нужен полный ответ на "How to upload file to Google Cloud Storage ?"

+0

Я не могу импортировать эти пакеты .. есть ли какие-нибудь библиотеки, которые мне нужно добавить? import com.google.api.services.storage.Storage; import com.google.api.services.storage.StorageScopes; – Jana

+0

ok Я добавил группу компиляции: 'com.google.apis ', имя:' google-api-services-storage ', версия:' v1beta1-rev21-1.14.1-beta 'в build.gradle, и импорт работает. – Jana

+0

, но теперь этот метод all() не распознается ... StorageScopes.all(); – Jana

0

код используется не для экземпляров App Engine. Вы можете поместить файл в формате JSON с приложением в папке /war/WEB_INF, как вы бы с любым статическим файлом, но лучшим решением будет использовать код, который работает именно на App Engine:

private static final AppIdentityService identityService = AppIdentityServiceFactory.getAppIdentityService(); 

String token = identityService 
       .getAccessToken(Arrays.asList("https://www.googleapis.com/auth/devstorage.full_control")).getAccessToken(); 
+0

Hi @Andrei, Прежде всего, спасибо за вашу помощь, но он возвращает invalidToken. Полное значение токена выглядит так: «InvalidToken: https: // www.googleapis.com/auth/devstorage.full_control:6058» –

+0

Я использую этот код в своих приложениях без проблем (одним из них является FileMambo.com). Вы включили правильный API облачного хранилища для своего проекта? –

+0

В моей консоли Google у меня есть эти два API: Google Cloud Storage, Google Cloud Storage JSON API –

Смежные вопросы