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
Wie kann ich wissen, ob das Token abgelaufen ist?
Speichert
AWS API
Token und Identity selbst? Wenn ja, wie kann man sie abrufen?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()));
}
}
}
"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
Das SDK sollte nicht unbedingt die API sein. –
Sieht aus wie. Ich habe etwas in meinem Code vermasselt. Ich poste es hier. Bitte schauen Sie sich den Code an – Naroju