2016-05-03 20 views
1

Ich arbeite an einer Android-App, in der Benutzer Dateien von Amazon S3 hochladen und herunterladen. Ich habe eine Authentifizierung für meine App entwickelt. Derzeit, wenn der Benutzer nur wenige Dateien hochladen möchte, erhalten Sie für jede Datei Benutzer IdentityID und Token durch Pingen meines Back-End.AWS Cognito und S3

Ich habe einige Fragen

  1. Wie kann ich wissen, ob das Token abgelaufen ist?

  2. Speichert AWS API Token und Identity selbst? Wenn ja, wie kann man sie abrufen?

  3. Was könnte der beste Weg sein, IdentityId und Token für mein Projekt zu verwenden? Backend für jede Datei aufrufen, um Token zu erhalten? Oder einmal aufrufen, wenn der Benutzer ein Bündel (ausgewählte) Dateien hochladen möchte? Oder Token speichern und erneut verwenden, wenn das Token nicht abgelaufen ist?

Code:

Auth.java:

public class Auth extends AWSAbstractCognitoDeveloperIdentityProvider { 



private Context ctx; 
public Auth(String accountId, String identityPoolId, Regions region,Context ctx) { 
    super(accountId, identityPoolId, region); 
     this.ctx=ctx; 

} 

@Override 
public String getProviderName() { 
    return "cognito-identity.amazonaws.com"; 

} 

@Override 
public String refresh() { 
    setToken(null); 

    if (getProviderName() != null && 
      !this.loginsMap.isEmpty() && 
      this.loginsMap.containsKey(getProviderName())&& internetchek.connectGoogle()) { 

     Log.d("Refreshing..","Loading.."); 
     Idtoken(); 

     update(identityId, token); 

     return token; 



    } else { 

     this.getIdentityId(); 
     return null; 
    } 

} 
@Override 
public String getToken() { 
    return token; 
} 

public void Idtoken(){ 



    String serverurl = constants.IP_ADDRESS_CREDENTIALS; 
    try { 
     save s = new save(this.ctx, constants.USER_DETAILS); 
     String phonenumber = s.read(constants.PHONE_NUMBER); 

     if (phonenumber != null) { 


      URL url = new URL(serverurl); 
      HttpURLConnection http = (HttpURLConnection) url.openConnection(); 
      http.setRequestMethod("POST"); 
      http.setDoInput(true); 
      http.setDoOutput(true); 

      OutputStream OS = http.getOutputStream(); 
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS, "UTF-8")); 
      String data = URLEncoder.encode("number", "UTF-8") + "=" + URLEncoder.encode(phonenumber, "UTF-8"); 
      bufferedWriter.write(data); 
      bufferedWriter.flush(); 
      bufferedWriter.close(); 
      OS.close(); 
      InputStream IS = http.getInputStream(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(IS, "iso-8859-1")); 
      String line = ""; 
      String response=""; 

      while ((line= bufferedReader.readLine()) != null) { 
       response = response+line; 

      } 
      bufferedReader.close(); 
      IS.close(); 
      http.disconnect(); 

      response = response.replaceAll("\\s+", ""); 

      Log.d("RESPONCE", response); 

      String[] splitter = response.split("=="); 
      if (splitter[0] != null) { 

       if (splitter[1] != null) { 

        identityId = splitter[0]; 
        token = splitter[1]; 

       } 

      } 
     } 
      Log.d("IDENTITYID",identityId); 
      Log.d("TOKEN",token); 

     }catch(MalformedURLException e){ 
      e.printStackTrace(); 
     }catch(UnknownHostException e) 
     { 
      e.printStackTrace(); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 

}} 

upload

private class Uploadfile extends AsyncTask<Void,Void,Void>{ 

    Context ctx; 
    String remotepath; 
    File file; 
    ProgressBar progressBar; 

    private Uploadfile(Context ctx,File file,String remotepath,ProgressBar progressBar){ 
     this.ctx =ctx; 
     this.file=file; 
     this.remotepath=remotepath; 
     this.progressBar =progressBar; 
    } 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     if(!internetchek.isNetworkAvailable(this.ctx)||!internetchek.connectGoogle()){ 
      Log.d("NETWORK","TRUE"); 
     }else { 
      Auth developerProvider = new Auth(
        null, 
        "ap-northeast-1:a871fa5fxxxxxxxxxxxxx1437244", 
        Regions.AP_NORTHEAST_1, this.ctx); 
      CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        this.ctx.getApplicationContext(), 
        developerProvider, 
        Regions.AP_NORTHEAST_1); 


      HashMap<String, String> loginsMap = new HashMap<String, String>(); 
      loginsMap.put("cognito-identity.amazonaws.com", credentialsProvider.getToken()); 
      credentialsProvider.setLogins(loginsMap); 
      credentialsProvider.refresh(); 

      ClientConfiguration configuration = new ClientConfiguration(); 
      configuration.setProtocol(Protocol.HTTP); 
      configuration.setSocketTimeout(5 * 10000); 
      configuration.setConnectionTimeout(5 * 10000); 
      configuration.setMaxErrorRetry(3); 
      configuration.setMaxConnections(100); 

      if (sS3Client == null) { 

       sS3Client = new AmazonS3Client(credentialsProvider, configuration); 

      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     if(sS3Client!=null){ 

      sTransferUtility = new TransferUtility(sS3Client, this.ctx); 

      observer = sTransferUtility.upload(remotepath, file.getName(), file); 
      transferObservers.add(observer); 

      observer.setTransferListener(new UploadListener(this.progressBar,observer,file.getPath())); 

     } 

    } 
} 

Antwort

0
  1. ich ohne Weiteres von zwei Methoden denken kann:

    a. Ein einfacher Versuch/catch-around-Code, der das Token verwendet. Wenn es eine entsprechende Ausnahme zurückwirft, erhalte eine neue und versuche es erneut.

    b. Bei authentifizierten Entwickleridentitäten konfigurieren Sie die gültige Länge des Tokens. Sie können dies leicht in der App verfolgen und entsprechend handeln, wenn es abläuft. Dies ist die Route, die ich empfehlen würde.

  2. Ich bin mir nicht sicher, was Sie damit meinen. Das SDK speichert sie nach dem Abrufen. Sie können die ID mit getIdentityId() oder getCachedIdentityId() erhalten, warum brauchen Sie das Token?

  3. Der ideale/empfohlene Fluss ist, dass Sie nichts manuell mit ihnen machen müssen. Sobald das SDK diese enthält, sollten Sie nur den Anmeldeinformationsanbieter verwenden können, um Anmeldeinformationen abzurufen, mit denen Sie auf S3 zugreifen können. Das würde das Token speichern und wiederverwenden, aber das sollte keine zusätzliche Arbeit sein.

EDIT:

Sie sollten nicht jedes Mal die Anbieter von Anmeldeinformationen in einem neuen Thread neu erstellt werden. Es wird Status verlieren und Sie müssen ständig Ihr Back-End kontaktieren. Es sollte ein Singleton sein, wie in der blog post und dem Beispiel (verlinkt auf diesem Blogpost) veranschaulicht.

Sie sollten dem Anbieter auch den Schlüssel des Providers geben, den Sie auf der Konsole konfiguriert haben, nicht cognito-identity.amazonaws.com.

Die Art, wie Sie das Token setzen, sieht auch aus.Die Probe setzt die Anmeldungen wie folgt aus:

CognitoSyncClientManager 
      .addLogins(
        ((DeveloperAuthenticationProvider) CognitoSyncClientManager.provider 
          .getIdentityProvider()).getProviderName(), 
        userName); 

Ich würde empfehlen, die Probe noch einmal geben, scheint es einige Unterschiede bei der Umsetzung zu sein.

+0

"Das würde das Token speichern und wiederverwenden, aber das sollte wiederum keine zusätzliche Arbeit sein." Bedeutet dies, dass API-Token gespeichert und automatisch wiederverwendet werden? – Naroju

+0

Das SDK sollte nicht unbedingt die API sein. –

+0

Sieht aus wie. Ich habe etwas in meinem Code vermasselt. Ich poste es hier. Bitte schauen Sie sich den Code an – Naroju