Çapraz etki alanı oturum açma: tek oturum ve Php siteyi django?

4 Cevap php

Django bir hizmet olarak küçük bir app inşa ediyorum ve şimdi bazı müşteriler PHP web uygulaması entegre etmek zamanıdır.

Etki Müşterimiz A www.a.com onun kullanıcıları için kendi kimlik doğrulaması yapar ve muhtemelen oturumları için çerezleri kullanır.

Nasıl onun etki alanından kullanıcılar giriş yapabilir ayrıca www.b.com/clientA/ dommain benim Django app üzerinde giriş?

Ben onları benim etki reloggin yapmak ve etki alanı A ile bir authbackend kontrol kimlik nasıl kullanılacağını görmek ancak kullanıcı iki kez geçmek / onun giriş girmek zorunda olacağı anlamına gelir: www.a.com ve www.b.com üzerinde.

Etki www.a.com gelen çerez erişme bence güvenlik nedeniyle mümkün değildir.

Bunu nasıl ele alabileceğinizi?

4 Cevap

Başka bir etki çerezleri erişemez varsayarak doğru. Bir subdomain üzerinde Ancak, eğer, onlar doğru ayarlanmış eğer çerezleri erişmek gerekir.

Kesinlikle tamamen ayrı etki onları gerekiyorsa, bu biraz zor olacak. Eğer mevcut PHP kodunu değiştirmek yapamıyorsanız, hemen hemen bunu unutabilirsiniz.

Bir seçenek OpenID kullanarak olacağını - bu mücadele için basit bir yol olabilir, PHP ve Python için kullanılabilir OpenID kütüphaneler var gibi. OpenID gibi authentiction üzerinde bir tek işaret var sağlayacak ve zaten çeşitli sitelerde kullanılan beri kanıtlanmış ve eserleri edilir.

Başka bir seçenek, özel bir single sign-on sistemi yazıyor.

Temel fikir, bir kullanıcı sitenize geldiğinde, bir giriş siteye yönlendirmek olduğunu. Bu PHP veya şeylerin Python ya sonuna, ya da ayırabilirsiniz. Burada, kullanıcı oturum olacak ve daha sonra giriş gizli bir anahtar oluşturur - bu bir karma olabilir, rasgele bir dize, sürece öngörülebilir değil gibi ne olursa olsun - Kullanıcı geri tuşu ile ana siteye yönlendirilir ve.

Ana site daha sonra kullanıcının bir anahtarı vardır görür ve kullanıcının anahtarı doğrulamak için perde arkasında giriş sitesine bir istek gönderir.

Şimdi kullanıcı bir yerinde kaydedilir. Kullanıcı ikinci sitesini ziyaret ettiğinde, çok giriş siteye kullanıcıyı yönlendirir. Kullanıcı zaten giriş beri, giriş site sadece yeni bir gizli anahtarı ile geri kullanıcıyı yönlendirir, ve ikinci bir site açma sitesinden doğrular ve şimdi kullanıcı kimlik bilgileri girişi için başka bir zaman kalmadan kaydedilir.

Tamam, bu bir Django PHP kullanıcıyı, ya da nasıl PHP bir Django parola "okumak" için kimlik doğrulaması için nasıl.

Ben OpenID iyi çözüm olduğunu düşünüyorum ama bugün aynı veritabanını paylaşan bir PHP uygulaması Django kullanıcıların kimliğini doğrulamak zorunda kaldı ve bu ben çözüldü nasıl:

<?php

/* Generates crypted hash the same way as Django does */
function get_hexdigest($algorithm, $salt, $raw_password) {
   if (!array_in($algorithm, array('md5', 'sha1'))) {
       return false;
   }
   return $algorithm($salt.$raw_password);
}

/* Checks if password matches the same way Django does */
function check_password($raw_password, $django_password) {
    list($algorithm, $salt, $hsh) = explode('$', $django_password);
    return get_hexdigest($algoritm, $salt, $raw_password) === $hsh;
}

?>

Anahtar Django olan şifreleri kaydeder hangi biçimini anlamak için:

[Algoritması] $ [tuz] $ [hash]

Yani, örneğin ben auth_user satırda parola, "admin" ile bir "admin" kullanıcı ve parola alanını vardı:

sha1$63a11$85a93f217a72212b23fb0d5b95f3856db9575c1a

Algoritması "SHA1" olduğunu, rastgele oluşturulan tuz, "63a11" ve şifrelenmiş karma "85a93f217a72212b23fb0d5b95f3856db9575c1a" dir.

Yani PHP şifrelenmiş karma kim üretmek? Basit bir tuzunu ve ham şifre birleştirmek ve bu durumda, algoritma ile karma, SHA-1:

<?php 

$salt = '63a11';
$pass = 'admin';

echo sha1($salt.$admin); // prints "85a93f217a72212b23fb0d5b95f3856db9575c1a"

?>

Bu zor değildi! Ben Django kaynaklarında ilgili kodu okuyarak aldım.

Sen HTTP ileri geri yönlendirir kullanabilirsiniz. Kullanıcı www.b.com erişir, ve hiçbir çerez ayarlandığında, www.a.com/crosslogin?return_to=URL&challenge=stuff yönlendirebilirsiniz. A.com üzerine, çerez için kontrol ve ayarlı ise, hiç redirecto URL?verified=otherstuff.

Kullanıcıların kimlik numara engellemek istiyorsanız bu meydan okuma-yanıt şifreleme gerektirir. a.com ve b.com kurulum için paylaşılan gizli gerekir, falan bu gizli ile şifrelenir. otherstuff de bu sır ile şifrelenir; çözüldüğü zaman, bu bir tuple (malzeme, kullanıcı) verir. b.com emin otherstuff sadece bir kez kullanılabilir olması için bir tekrar önbellek tutmak gerekebilir.

Ben aşağıdaki seçenekleri:

1) Jani Hartkainen olarak kullanın Açık kimliği önerdi. Bu en iyi çözüm olabilir.

2) http ters proxy üzerinden bir etki alanı kullanın:

Aynı etki üzerinde php uygulama ve Django uygulamasını hem de koymak ters http proxy kullanabilirsiniz. Bu size php app oturumları çerezleri erişim imkanı verecektir.

Once you get the php session id in your django application run a request to the PHP application with the session cookie set to check who is logged in. Unfortunately this may require html scraping or implementing a simple service in PHP application that would return a name of the logged in user. Once you get the logged in user you can authorize it in your django app.

3) GET yoluyla geçirilen PHP session id:

Modify the PHP app to add session id as a parameter to links to your django app. For example ask clients to refer to your web site as follows:

<yourwebsite.com>/?client_session_id=<session_id>&client_name=<client_name>

Eğer oturum kimliğini aldıktan sonra 2. maddede açıklandığı gibi kullanıcı kimlik doğrulaması yapabilirsiniz.