2017-06-07 4 views
0

Je fais la connexion pour mon application. Mais, j'ai besoin de jeton CRSF pour la connexion dans l'application. D'abord, j'essaie d'envoyer un cookie et d'obtenir un csrf. Mais je suis débutant et ça ne marche pas. En fait, je ne sais pas ce que je fais. J'utilise cette application sur mon site Web. Et j'utilise django pour le site Web et API (Django Rest Framework) pour l'application Android.Comment puis-je me connecter à l'application Android avec (Django) CSRF?

private static final String KEY_LOGIN = "http://192.168.1.102:8080/api-auth/login/"; 
private static final String KEY_CSRF = "csrf"; 
public static final String KEY_EMAIL = "email"; 
public static final String KEY_PASSWORD = "password"; 

CookieManager cookieManager; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 


    editTextEmail = (EditText) findViewById(R.id.editTextEmail); 
    editTextPassword = (EditText) findViewById(R.id.editTextPassword); 

} 

private void loginUser() 
{ 
    final HttpCookie cookie = new HttpCookie("lang", "tr"); 
    try { 
     cookieManager.getCookieStore().add(new URI("http://192.168.1.102:8080/api-auth/login/"), cookie); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 

    final String email = editTextEmail.getText().toString().trim(); 
    final String password = editTextPassword.getText().toString().trim(); 

    StringRequest stringRequest = new StringRequest(Request.Method.POST,KEY_LOGIN,new Response.Listener<String>() 
    { 

     @Override 
     public void onResponse(String response) { 
      if(response.contains("is_admin")) { 
      openProfileCompany();} 

     else 
     { 
      openProfileUser(); 
     }}}, 

    new Response.ErrorListener() 
    { 
     @Override 
     public void onErrorResponse(VolleyError error) 
     { 
      Toast.makeText(Home.this,error.toString(),Toast.LENGTH_LONG).show(); 
     } 
    }){ 

     public String csrf; 

     @Override 
protected Map<String,String> getParams(){ 

    Map<String,String> params = new HashMap<String,String>(); 
    params.put(KEY_EMAIL,email); 
    params.put(KEY_PASSWORD,password); 
    params.put(KEY_CSRF,csrf); 

    return params; 
} 
    }; 
+0

Pour le client android, je recommande l'utilisation du jeton django-rest-framework, je peux vous donner à la fois le code django et le code okhttp si vous le souhaitez. – Ykh

+0

Merci pour votre intérêt. Ce sera bon pour moi si vous pouvez me les donner. – AlpYuktug

Répondre

0

Django Django et Rest Cadre: setting.py

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticatedOrReadOnly', 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'user.auth.TokenAuthentication', 
    ), 
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler', 
    'PAGE_SIZE': 5, 
    'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S', 
} 

user-> auth.py

class TokenAuthentication(TokenAuthentication): 
    # Authorization:Token 401f7ac837da42b97f613d789819ff93537bee6a 
    keyword = 'Token' 
    model = Token 

    def authenticate_credentials(self, key): 
     model = self.get_model() 
     try: 
      token = model.objects.select_related('user').get(access_token=key) 
     except model.DoesNotExist: 
      raise exceptions.AuthenticationFailed(_('Invalid token.')) 

     if not token.user.is_active: 
      raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) 

     return token.user, token 

modèle Token:

def generate_key(): 
    return binascii.hexlify(os.urandom(20)).decode() 
class Token(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, 
           null=True, 
           on_delete=models.CASCADE, 
           verbose_name=u'user') 
    access_token = models.CharField(unique=True, 
            default='', 
            max_length=40, 
            verbose_name=u'Token') 
    refresh_token = models.CharField(unique=True, 
            default='', 
            max_length=40, 
            verbose_name=u'Token') 

    class Meta: 
     verbose_name = 'Token' 
     verbose_name_plural = 'Token' 

    def save(self, *args, **kwargs): 
     if not self.access_token: 
      self.access_token = generate_key() 
     if not self.refresh_token: 
      self.refresh_token = generate_key() 
     return super(Token, self).save(*args, **kwargs) 

    def refresh_access_token(self): 
     self.access_token = generate_key() 

    def __str__(self): 
     return self.access_token 

créer un jeton par exemple quand vous android client registre comme Token.objects.create(user=user), et quand la connexion de l'utilisateur, un jeton de retour au client android, quelque chose comme:

try: 
    token = user.token 
except ObjectDoesNotExist: 
    token = Token.objects.create(user=instance) 
data = {'id': user.id, 'token': token.access_token)} 
return Response(data) 

votre client android obtenir votre propre jeton, le jeton sera votre identifiant client, enregistrez-le dans Preferences.Then ajouter en-tête la clé est Authorization, la valeur est Authorization, la valeur est Token xxxxxxxxxxxxxxxxxxxxxxxx, xxxxxxxxxxxxxxxxxxxxxxxx est la chaîne de token retour par django, puis chaque demande envoyée par votre android sera auth par jeton, vous pouvez obtenir votre utilisateur dans django par request.user .That'a Tout, si vous avez une autre question, n'hésitez pas à me demander.