2015-03-18 28 views
18

PHPFox'da geliştirilen bir web sitesinin kodundan yöntem ve kaynakları kullanmak istiyorum.'Token Tabanlı Kimlik Doğrulama', PHPFox'ta geliştirilen web sitesinin kaynaklarına (yani işlev ve veri) erişmek için nasıl güvenli bir şekilde uygulanır?

Temel olarak, iPhone/Android'dan istek alırım, isteği alıp PHPFox kodundan ilgili işleve iletirim, yanıtı bu işleve geri alıp cihaza geri gönderirim.

Bu amaçla, İnce çerçeve kullanarak REST API'leri geliştirdim. Ancak şu anda karşı karşıya olduğum başlıca engelleyici, PHPFox web sitesinin kaynaklarına (yani işlev ve veri) erişmekte.

Web sitesinin kaynaklarına erişmek için 'Jeton Tabanlı Kimlik Doğrulama''u kullanarak kullanıcının kimliğini nasıl doğrulamalıyım.

Birisi bana yararlı bir çalışma örneği ile doğru yönde bana rehberlik edebilirse, benim için gerçekten yararlı olacaktır.

N.B. : 'Token Tabanlı Kimlik Doğrulamanın' önerilen uygulaması hızda çok güvenli ve hızlı olmalıdır. Güvenlik herhangi bir şekilde tehlikeye atılmamalıdır.

Kendi kendime denediğim kod aşağıdadır, ancak doğru ya da yanlış olup olmadığını bilmiyorum. Benim yaklaşımım doğru ya da yanlış. Lütfen birileri analiz edin ve bu konuda görüşlerinizi bildirin.

i Yani bir kullanıcı (genericPart + onun veriler kodlanmış) kendini onaylanmaktadır ve bir simge içeriyor dizisi alabilir, kullanıcının veri

define('SECRET_KEY', "fakesecretkey"); 

function createToken($data) 
{ 
    /* Create a part of token using secretKey and other stuff */ 
    $tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"]; // It can be 'stronger' of course 

    /* Encoding token */ 
    $token = hash('sha256', $tokenGeneric.$data); 

    return array('token' => $token, 'userData' => $data); 
} 

parametre olarak alır Bu fonksiyonu kullanmak bir simge oluşturmak için ve hisData kodlanmamış:

function auth($login, $password) 
{ 
    // we check user. For instance, it's ok, and we get his ID and his role. 
    $userID = 1; 
    $userRole = "admin"; 

    // Concatenating data with TIME 
    $data = time()."_".$userID."-".$userRole; 
    $token = createToken($data); 
    echo json_encode($token); 
} 

Ardından kullanıcı kontrol etmek için beni onun belirteç + onun un-kodlanmış veri gönderebilir:

define('VALIDITY_TIME', 3600); 

function checkToken($receivedToken, $receivedData) 
{ 
    /* Recreate the generic part of token using secretKey and other stuff */ 
    $tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"]; 

    // We create a token which should match 
    $token = hash('sha256', $tokenGeneric.$receivedData); 

    // We check if token is ok ! 
    if ($receivedToken != $token) 
    { 
     echo 'wrong Token !'; 
     return false; 
    } 

    list($tokenDate, $userData) = explode("_", $receivedData); 
    // here we compare tokenDate with current time using VALIDITY_TIME to check if the token is expired 
    // if token expired we return false 

    // otherwise it's ok and we return a new token 
    return createToken(time()."#".$userData); 
} 

$check = checkToken($_GET['token'], $_GET['data']); 
if ($check !== false) 
    echo json_encode(array("secureData" => "Oo")); // And we add the new token for the next request 

Doğru muyum?

Teşekkürler.

cevap

61

İlk olarak, jeton tabanlı kimlik doğrulamanın ne olduğunu anlamanız gerekir. Aşağıdaki gibi açıklanabilir.

Simge tabanlı kimlik doğrulama sisteminin arkasındaki genel kavram basittir. Kullanıcıların kullanıcı adlarını ve şifrelerini girmelerine izin vermek için numarasına bir kullanıcı adı ve şifresi kullanmadan belirli bir kaynağı - almasını sağlayan bir jeton alın. Jetonları elde edildikten sonra kullanıcı, bir zaman aralığı için özel kaynağına erişim sağlayan belirteci - uzak siteye sunabilir. Read more

Şimdi senin REST web hizmeti gibi uygulanmasının adımların ne görelim.

  • kullanıcı giriş formundaki kullanıcı adı ve parola sağlar ve Log In tıklamaları:

    Kontrolden aşağıdaki akışından yararlanır.

  • Bir istek yapıldıktan sonra, veritabanında sorgulayarak kullanıcıyı arka uçta doğrulayın. İstek geçerliyse, veritabanı üzerinden getirilen kullanıcı bilgilerini kullanarak tarafından bir belirteç oluşturun ve numaralı bilgiyi geri tepme başlığında döndürerek tarayıcısını yerel depolama biriminde saklayabiliriz.
  • Uygulamadaki kısıtlı bitiş noktalarına erişmek için her istek üstbilgisinde belirteç bilgisi sağlayın.
  • İstek başlık bilgisinden getirilen belirteç geçerliyse, kullanıcının belirtilen son noktaya erişmesine izin verin ve JSON veya XML ile yanıt verin.

kontrol akışı için aşağıdaki resme bakın

enter image description here

Bir JWT

JWT JSON Web Token açılımı var ve bir belirteç biçimi ne olduğunu merak olabilir yetki başlıklarında kullanılır. Bu simge, iki sistem arasında güvenli bir şekilde iletişimi tasarlamanıza yardımcı olur. Bu eğiticinin amaçları için JWT'yi "taşıyıcı belirteci" olarak yeniden yazalım. Taşıyıcı belirteci, üç bölümden oluşur: başlık, yük ve imza.

  • Başlık, belirtecin taban-64 ile de şifrelenmiş olan belirteç türünü ve şifreleme yöntemini tutan kısmıdır.
  • Yük, bilgileri içerir. Her biri baz-64 şifrelemesiyle saklanan kullanıcı bilgileri, ürün bilgileri ve benzeri her türlü veriyi koyabilirsiniz.
  • İmza, başlık, faydalı yük ve gizli anahtarın kombinasyonlarından oluşur. Gizli anahtar sunucu tarafında güvenli bir şekilde tutulmalıdır. JWT şemasını ve aşağıdaki örnek belirtecini görebilirsiniz;

enter image description here

sen php-jwt kullanabilirsiniz gibi taşıyıcı belirteç jeneratörü uygulamak gerekmez.

Yukarıdakilerin sizin karışıklığınızı açıklamasını umarız. Belirteç tabanlı kimlik doğrulamayı uygulayan herhangi bir sorunla karşılaşırsanız bana bildirin. Sana yardım edebilirim.

+0

Sorunumun ilgisini gösterdiğim ve gerçekten 'Jeton Tabanlı Kimlik Doğrulama'nın ne olduğunu anlamamı sağladığınız için teşekkürler. Ama lütfen bana php-jwt'nin çalışma örneğini sıfırdan verebilir misiniz, böylece bunu sistemime kopyalayabileceğim. Kod, veritabanı tablosu oluşturma, PHP ve MySQL arasındaki bağlantı, daha sonra güvenlik belirteci oluşturma, mevcut oturum açmış kullanıcı için güvenlik belirtecinin geçerliliğini kontrol etme, vb. Her şeyi içermelidir. Bir seferde ve her kullanıcı için bu 'Token Tabanlı Kimlik Doğrulama' çalışmalıdır. TY. – user2839497

+0

Lütfen soru bedenimin sonuna bir göz atın. Bir kod denedim. Doğru olup olmadığını kontrol edebilir misiniz? İşleri doğru mu yapıp yapmadım? – user2839497

+1

İyileştirme alanı var ama hepsi doğru. Yapmanız gereken, jeton jenerasyonu ve doğrulama için php-jwt kullanmaktır. Ben çok daha iyi olacağım. Ama bu da tamamdır. – Techie

İlgili konular