2017-06-07 12 views
0

私のアプリケーションにログインします。しかし、私はアプリでログインするためのCRSFトークンが必要です。まず、私はクッキーを送り、csrfを取得しようとします。しかし私は初心者であり、動作しません。実際、私は何を作るのか分からない。(Django)CSRFでAndroidアプリにログインするにはどうすればよいですか?

私のウェブサイトでこのアプリを使用しています。そして私はアンドロイドアプリのWebサイトとAPI(Django Rest Framework)にdjangoを使用しています。

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

アンドロイドクライアントの場合は、django-rest-frameworkトークン認証を使用することをお勧めします。必要に応じて、djangoコードとokhttpコードの両方を提供できます。 – Ykh

+0

ありがとうございました。もしあなたが私にそれらを与えることができれば、それは私のために良いでしょう。 – AlpYuktug

答えて

0

ジャンゴとDjango残りフレームワーク: 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 

トークンモデル:

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 

トークンを作成しますあなたがアンドロイドするときのインスタンスクライアントはToken.objects.create(user=user)のように登録し、ときに、ユーザのログイン、Androidのクライアントへの戻りトークン、のようなもの:

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

あなたのAndroidクライアント独自のトークンを取得し、トークンは、ヘッダを追加Preferences.Thenに保存し、クライアントIDになりますあなたのアンドロイドにHttpClient、鍵はAuthorization、値はToken xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxはdjangoが返すトークン文字列、あなたのアンドロイドによって送られるすべてのリクエストはトークンで認証されます。request.userであなたのユーザーを取得できます。皆さん、別の質問がある場合は、私にお気軽にお問い合わせください。

関連する問題