Client Androïd JWT
Posted on: 26 juin 2020 /
Categories: Androïd
Cet article est la suite de l’article Token JWT.
Dans cet article nous allons voir l’implémentation d’un token JWT afin de sécurisé notre exemple de gestion de produit.
Param.java :
package org.libreapps.rest;
public class Param {
private String token;
private static Param param;
private Param() {
}
public static Param getInstance() {
if (param == null) {
param = new Param();
}
return param;
}
public void setToken(String token) { this.token = token; }
public String getToken() { return token; }
}
LoginActivity.java :
package org.libreapps.rest;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.concurrent.ExecutionException;
public class LoginActivity extends AppCompatActivity {
private EditText userEmail;
private EditText userPassword;
private Button buttonLogin;
private Button buttonRegister;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
userEmail = (EditText)findViewById(R.id.user_email);
userPassword = (EditText)findViewById(R.id.user_password);
buttonLogin = (Button)findViewById(R.id.button_login);
userEmail.setText("");
userPassword.setText("");
buttonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
JSONObject jAuth = new JSONObject();
jAuth.put("email", userEmail.getText().toString());
jAuth.put("password", userPassword.getText().toString());
jAuth.put("app", "MNA");
Log.v("LoginActivity", userEmail.getText().toString()+" "+userPassword.getText().toString());
ConnectionRest connectionRest = new ConnectionRest();
connectionRest.setObj(jAuth);
connectionRest.setAction("auth");
connectionRest.execute("POST");
String token = connectionRest.get();
Param.getInstance().setToken(token);
if(token.charAt(0)=='{') {
Log.v("LoginActivity", token);
}else{
Param.getInstance().setToken(token);
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}
} catch (JSONException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
});
}
}
activity_login.xml :
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginActivity">
<EditText
android:id="@+id/user_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="E-Mail"
android:inputType="textEmailAddress"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.339" />
<EditText
android:id="@+id/user_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Password"
android:inputType="textPassword"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.425" />
<Button
android:id="@+id/button_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="56dp"
android:text="CONNECTION"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.484" />
</androidx.constraintlayout.widget.ConstraintLayout>
ConnectionRest.java :
package org.libreapps.rest;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
public class ConnectionRest extends AsyncTask<String, Void, String> {
private final static String URL = "<URL>";
private JSONObject jsonObj = null;
private String action = "product";
@Override
protected String doInBackground(String... strings) {
try {
return get(strings[0]);
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
public String get(String methode) throws IOException, JSONException {
String url = URL + action + "/";
String token = Param.getInstance().getToken();
InputStream is = null;
String parameters = "";
if(!methode.equals("POST")&&(jsonObj!=null)){
url += jsonObj.getInt("id");
}
if(jsonObj != null){
if(methode.equals("PUT")){
jsonObj.remove("id");
}
parameters = "data="+URLEncoder.encode(jsonObj.toString(), "utf-8");
//Log.v("URL", url+" "+parameters);
}
try {
final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod(methode);
if (token != null) {
conn.setRequestProperty("Authorization", "Bearer " + URLEncoder.encode(token, "utf-8"));
}
// Pour les methode POST et PUT on envoie les parametre avec l'OutputStreamWriter
if(methode.equals("POST")||methode.equals("PUT")){
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
out.write(parameters);// here i sent the parameter
out.close();
}else{
conn.setDoInput(true);
conn.connect();
}
is = conn.getInputStream();
// Lit le InputStream et l'enregistre dans une string
return readIt(is);
} finally {
// Pour etre sur que le InputStream soit ferme apres avoir quitter l'application
if (is != null) {
is.close();
}
}
}
private String readIt(InputStream is) throws IOException {
BufferedReader r = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
response.append(line).append('\n');
}
return response.toString();
}
public ArrayList<Product> parse(final String json) {
try {
final ArrayList<Product> products = new ArrayList<>();
final JSONArray jProductArray = new JSONArray(json);
for (int i = 0; i < jProductArray.length(); i++) {
products.add(new Product(jProductArray.optJSONObject(i)));
}
return products;
} catch (JSONException e) {
Log.v("TAG","[JSONException] e : " + e.getMessage());
}
return null;
}
public void setObj(JSONObject jsonObj){
this.jsonObj = jsonObj;
}
public void setAction(String monAction){ this.action = monAction;}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}
La suite : Enregistrement d’un client Android
Code source : https://github.com/emunier/Rest-jwt.git
Sources :
https://eric.munier.me
