• 13-10-2014, 11:04:16
    #1
    Merhaba, sadece kendi sitelerim için kullanacağım ortak bir üyelik sistemi hazırlamaya çalışıyorum özetle durum şöyle:

    Tüm siteler aynı sunucuda ve veritabanı ortak. Amaç sitelerden birinde giriş yapılıınca, diğer site ziyaret edildiğinde form kullanmadan üyenin sessionlarını oluşturmak.



    4, 5 -> alt sitede üye sessionu yoksa belli aralıklarla api servera bağlanır, serverda session varsa tek kullanımlık bir key

    oluşturulur ve veritabanına yazılır, key üye idsi ile birlikte alt site urline eklenir, alt siteye urlden gelen key veritabanındakiyle

    eşleşiyorsa üye sessionu oluştrulur veritabanındaki key yenilenir..

    2, 3 -> Üye alt siteden signin veya signup tıklar ve api server üyelik işlemlerine gider, serverda urlden gelen siteidsi alınır

    veritabanından sitenin urli çekilir ve en son hangi siteden gelindiğini tutan sessiona yazılır. Üye giriş yapınca tek kullanımlık bir

    key oluşur ve dbye yazılır. Geldiği siteye geri gönderilirken urle üyenin idsi ve keyi de eklenir.. alt site key ve id gelmişse id ve

    keyin eşleştiği user varsa sessionları oluşturur ve keyi yeniler.

    2,3,4,5 -> hangi alt siteden servera gidildiye sadece o sitede üye sessionları oluşturuldu. Diğer alt siteler 4,5 işlemini uyguluyor.

    7 -> Servera alt siteler kullnılmadan doğrudan erişilip giriş yapıldıysa hangi siteye dönüleceği bilgisi olmadığından, alt sitelere

    gidiş linklerine serverda üye girişi yapıldığını belirten veri yollanır ve alt site, serverda giriş kontrolünü yapacağı bir sonraki

    zamanı beklemeden 4,5 işlemini uygular.


    Buraya kadar olan kısmı kodladım, hazır. Takıldığım yerse üyelerin çıkış işlemi.

    İhtimal 1 -> Sadece alt sitede sessionları sildik. Belli aralıklarla serverda kontrol yapıyodu onu da engelledik. Ama üye çıkış

    yaptığı alt sitede başka bir kullanıcı olarak oturum açarsa diğer sitelerdeki session durumuna da bağlı olarak işler biraz karışçak.

    İhtimal 2 -> Serverdan sessionları sileriz ama bu durumda bütün alt sitelerdeki sessionları da silmem lazım. Hatta önce alt

    sitelerdeki sessionların silindiğinin teyitini alıp serverdaki sessionları ondan sonra silmek gerek. Şu an 2 site bağlancak sadece

    apiye yani mümkün ama 5,6,7 site olduğu zaman hoş olmicak..

    Hem çıkış yaptırma hakkında önerilerinizi, hem de genel şurayı şöyle değil de böyle yapsan şu sebeple daha iyi olur gibi görüşler çok makbule geçer.
    İyi çalışamlar.
    .
  • 13-10-2014, 12:36:07
    #2
    codeksper adlı üyeden alıntı: mesajı görüntüle
    Merhaba, sadece kendi sitelerim için kullanacağım ortak bir üyelik sistemi hazırlamaya çalışıyorum özetle durum şöyle:



    Tüm siteler aynı sunucuda ve veritabanı ortak. Amaç sitelerden birinde giriş yapılıınca, diğer site ziyaret edildiğinde form kullanmadan üyenin sessionlarını oluşturmak.







    4, 5 -> alt sitede üye sessionu yoksa belli aralıklarla api servera bağlanır, serverda session varsa tek kullanımlık bir key



    oluşturulur ve veritabanına yazılır, key üye idsi ile birlikte alt site urline eklenir, alt siteye urlden gelen key veritabanındakiyle



    eşleşiyorsa üye sessionu oluştrulur veritabanındaki key yenilenir..



    2, 3 -> Üye alt siteden signin veya signup tıklar ve api server üyelik işlemlerine gider, serverda urlden gelen siteidsi alınır



    veritabanından sitenin urli çekilir ve en son hangi siteden gelindiğini tutan sessiona yazılır. Üye giriş yapınca tek kullanımlık bir



    key oluşur ve dbye yazılır. Geldiği siteye geri gönderilirken urle üyenin idsi ve keyi de eklenir.. alt site key ve id gelmişse id ve



    keyin eşleştiği user varsa sessionları oluşturur ve keyi yeniler.



    2,3,4,5 -> hangi alt siteden servera gidildiye sadece o sitede üye sessionları oluşturuldu. Diğer alt siteler 4,5 işlemini uyguluyor.



    7 -> Servera alt siteler kullnılmadan doğrudan erişilip giriş yapıldıysa hangi siteye dönüleceği bilgisi olmadığından, alt sitelere



    gidiş linklerine serverda üye girişi yapıldığını belirten veri yollanır ve alt site, serverda giriş kontrolünü yapacağı bir sonraki



    zamanı beklemeden 4,5 işlemini uygular.





    Buraya kadar olan kısmı kodladım, hazır. Takıldığım yerse üyelerin çıkış işlemi.



    İhtimal 1 -> Sadece alt sitede sessionları sildik. Belli aralıklarla serverda kontrol yapıyodu onu da engelledik. Ama üye çıkış



    yaptığı alt sitede başka bir kullanıcı olarak oturum açarsa diğer sitelerdeki session durumuna da bağlı olarak işler biraz karışçak.



    İhtimal 2 -> Serverdan sessionları sileriz ama bu durumda bütün alt sitelerdeki sessionları da silmem lazım. Hatta önce alt



    sitelerdeki sessionların silindiğinin teyitini alıp serverdaki sessionları ondan sonra silmek gerek. Şu an 2 site bağlancak sadece



    apiye yani mümkün ama 5,6,7 site olduğu zaman hoş olmicak..



    Hem çıkış yaptırma hakkında önerilerinizi, hem de genel şurayı şöyle değil de böyle yapsan şu sebeple daha iyi olur gibi görüşler çok makbule geçer.

    İyi çalışamlar.

    .

    Eğer benimki gibi güvenlik gerektirmeyecek bir sistem olsaydı ip ile yapmanı önerirdim ama güvenlik iyidir başkalarının cevaplarını bekliyorum
  • 13-10-2014, 18:45:54
    #3
    codeksper adlı üyeden alıntı: mesajı görüntüle
    İhtimal 1 -> Sadece alt sitede sessionları sildik. Belli aralıklarla serverda kontrol yapıyodu onu da engelledik. Ama üye çıkış

    yaptığı alt sitede başka bir kullanıcı olarak oturum açarsa diğer sitelerdeki session durumuna da bağlı olarak işler biraz karışçak.
    Neden burada cookie kullanmıyorsunuz? Sanki cookie ile iş gidebilir diye düşünüyorum.

    Belki şu denenebilir (ne gibi sonuçlar doğurur tam bilmiyorum)

    Kullanıcı giriş yaptığı zaman db'ye kaydettiğin token'ı şifreleyerek kullanıcıda bir cookie oluşturursun. Cookie sonunda da -all tarzı birşey koyabilirsin. -all demek tüm siteleri içeriyor gibi olabilir.

    Eğer kullanıcı bir siteden çıkış yaparsa sadece all' kısmını replace edip -x, diğer sitenden de çıkış yaparsa -x'e -y gibi birşey ekleyerek tüm siteleri senin belirlediğin değerlerde dışarıda bırakabilirsin.

    Tamamen varsayım üzerinden gittim, denenmiş veya yapılmış birşey değildir.

    Güzel bir projeye başlamışsın ama sunucu tarafına çok yük bindiriyorsun diye düşünüyorum. Sunucuya fazla yük bindirmemek için nasıl birşey yapıcaksın?
  • 14-10-2014, 04:38:52
    #4
    Sessionları saymazsak sunucuya ekstra yük olan bi'şey yok hocam. Mavi oklar belli zaman aralıklarıyla (ki bu zaman aralığı 10 saniye falan değil 10 dakka, 15 dakka gibi daha da arttırılabilir) apiserverın bulunduğu siteye bağlanıp oturum kontrolü yapıyor, oturum yoksa 15 dakka kadar sonra yine aynı işlemi uyguluyor. Kırmızı oklar sadece giriş yap veya üye ol butonlarından apiye yönleniyor, giriş yoksa form açılıyor, giriş yapıldıysa geldiği urle şifre ve key ekleyerek geri gönderiyor, alt sitede de session oluşuyor ve bir daha apiye bağlantı yok. Sunucuya binen ekstra yük sadece (site sayısı * ~4 {diğer sitelerde de geziniyorsa}) session ve fazladan birkaç tane if koşulu.

    Siteler aynı sunucuda da olsa bir sitede oluşturduğumuz cookieyi diğer sitede kullanmanın bi yolunu bulamadım (mümkün olabilir ama ben yapamadım). Curl ile bişeyler yapılabilir belki ama iframe veya ajaxa yaptığımız işi sunucuya yüklemiş oluruz. Yine de üstünde durmaya değer gibi, belki yeni fikirler üretilebilir, teşekkürler.
  • 15-10-2014, 07:43:49
    #5
    Tam olarak anlayamadım aşamaları sanırım sabaha kadar çalıştığımdan. Mesajım bulunsun gün içinde tekrar bakarım.

    Bir cookie'yi birçok sitede kullanmak pek sağlıklı değil. Şu şekilde yaparsan bir cookie'yi diğer sitelere yayabilirsin. Tekrar belirtiyorum küçük hataları olabilir oldukça yorgunum konu ilgimi çektiği için yazmadan kendimi alıkoyamadım.

    Not : Kullanıcı çıkış yaptığında APIServer.com üzerinden çıkış yapar. APIServer.com veritabanındaki token etkisiz hale getirilir (silinir veya bir status kolonu eklenip durum kontrolü yapılabilir).


    APISERVER.com -> API Server
    DENEME1.com -> Deneme Server

    Kullanıcı herhangi bir site üzerinden giriş yaptığında APIServer.com üzerinden bir session veya cookie oluşturur ve kullanıcıya atama yapar. (Ben cookie ile devam edeyim aşağıdaki kodlarda)

    Deneme1.com içerisine bir atama yaparsın ;
    <?
    
    if ($_COOKIE["login_check"]) {
    /*
    Gelen login_check cookiesine göre kontrol işlemleri yapılır. 
    Mesela cURL ile Apiserver.com/control.php 'ye bağlanırsın. Apiserver.com'dan gelen cevaba göre işlem yaparsın. Eğer gelen cevap başarısızsa;
    $_COOKIE["login_check"] = '';
    yaparsan güvenliği sağlamış olursun. 
    Sayfa her yenilendiğinde kontrol işlemi gerçekleşmelidir. Aksi halde güvenlik zafiyeti oluşabilir. 
    */
    } else 
    { echo '<script src="http://apiserver.com/callback.php"></script>'; }
    
    ?>
    Apiserver.com tarafı ;
    login.php

    <?
    function generateToken($username) {
    $token = md5(rand(0,99999999999).md5(rand(0,99999999999));
    /* Örnek token tablosu : id | token | username */
    mysql_query("insert into tokens values(null,'".$token."','".$username."')");
    return $token;
    }
    
    /* Kullanıcı doğru şekilde APIServer.com üzerinden giriş yaptığında ; */
    $username = $_POST["username"];
    $token = generateToken($username);
    setcookie ("user_logged", $token, time() - 3600*24);
    ...
    
    ?>

    callback.php

    <? 
    function getToken() {
    /*
    Kullanıcıya apiserver.com tarafından atanan cookie veya session'a göre 
    */
    }
    if ($_COOKIE["user_logged"]) {
    $token = getToken();
    if ($token) {
    /*
    Aşağıdaki javascript kodları Deneme1.com üzerinden çağrıldığından Deneme1.com üzerinde çalışacaktır. Böylece cookie atamasıda Deneme1.com üzerinden gerçekleşecektir.
    */
    ?>
    function Set_Cookie( name, value, expires, path, domain, secure )
    {
    var today = new Date();
    today.setTime( today.getTime() );
    if ( expires )
    {
    expires = expires * 1000 * 60 * 60 * 24;
    }
    var expires_date = new Date( today.getTime() + (expires) );
    document.cookie = name + "=" +escape( value ) +
    ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
    ( ( path ) ? ";path=" + path : "" ) +
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ( ( secure ) ? ";secure" : "" );
    }
    
    Set_Cookie( 'login_check', '<?=$token?>', '', '/', '', '' );
    location.reload();
    <?
    }
    ?>
    control.php

    /* 
    Bu kısımda APIServer.com ile Deneme1.com iletişim halinde olur. 
    Kullanıcıya atanan cookie'nin doğru olup olmadığını kontrol eder ona göre geri dönüş sağlar.
    */
    function checkToken($token) {
    $query = mysql_query("select * from tokens where token='".$token."'");
    return mysql_num_rows($query)
    }
    
    $token = $_POST["token"];
    if (checkToken($token)) { 
    echo 'logged';
    } else { echo 'invalid_token'; } 
    /* Artık sunucuya ne geri döndürmek istiyorsanız, user_id olur yada mysql_fetch_assoc APIServer.com daki kullanıcı bilgilerini alıp json_encode yaparak döndürebilirsin. */
  • 15-10-2014, 09:49:32
    #6
    @Dogukan;
    Hocam aslında yapıyı kodladım sunucuya attım denemelerimi yaptım, güvenli bi' yapı oldu ve tek sorunum çıkış yaptırmaktı ama fikir o kadar parlak ki az sonra başlicam değiştiriyorum yapıyı, aslında her sayfa çalıştığında api sunucusuyla iletişim hali olsun istemiyorum belki ufak değişiklikler yaparım kodlamaya başlayınca ama ana fikir gerçekten çok iyi.

    Eline koluna sağlık, teşekkürler. r10plus