2015-10-25 17 views
5

मैं keys बुलाया मेरी डेटाबेस में एक मेज इस संरचना है कि:Laravel: उत्पन्न यादृच्छिक अद्वितीय टोकन

id | user_id | token_id | token_key 

हर बार अपनी साइट में एक उपयोगकर्ता के लॉग, मैं के लिए एक नया token_id और token_key सेट उत्पन्न करने के लिए की जरूरत है वह उपयोगकर्ता दो मानों को अद्वितीय रखते हुए मैं token_id और token_key दोनों के लिए यादृच्छिक टोकन कैसे उत्पन्न कर सकता हूं?

उदाहरण के लिए, यदि:

  • token_id है dfbs98641aretwsg,
  • token_key है sdf389dxbf1sdz51fga65dfg74asdf

अर्थ:

id | user_id | token_id   | token_key 
1 | 1  | dfbs98641aretwsg | sdf389dxbf1sdz51fga65dfg74asdf 

साथ तालिका में कोई अन्य पंक्ति नहीं हो सकता है टोकन का संयोजन। मैं यह कैसे कर सकता हूँ?

उत्तर

10

मैं इस तरह के मामले के लिए एक अतिरिक्त पैकेज से बचने से बचूंगा। कुछ ऐसा:

do { 
    $token_id = makeRandomToken(); 
    $token_key = makeRandomTokenKey(); 
} while (User::where("token_id", "=", $token_id)->where("token_key", "=", $token_key)->first() instanceof User); 

... करना चाहिए। 'उपयोगकर्ता' से अलग होने पर मॉडल नाम को अपने साथ बदलें, और यादृच्छिक तार बनाने के लिए अपने या सुझाए गए कार्यों का उपयोग करें।

+0

आप व्याख्या कर सकते हैं कि कैसे, जबकि पाश वहाँ जीता गारंटी देगा कोई डुप्लीकेट नहीं होगा? – user5486944

+0

अधिक विशेष रूप से, जबकि लूप में 'exampleof' क्या करता है? – user5486944

+2

['do-while'] (http://php.net/manual/en/control-structures.do.while.php) लूप" तब "जारी रखेगा जब तक कि" while "में कथन का मूल्यांकन सत्य के रूप में होगा '(और यह 'while-do' के विपरीत, कम से कम एक बार चलाएगा)। इस विशिष्ट उदाहरण में, यह टोकन आईडी/कुंजी जोड़ी उत्पन्न करेगा, फिर यह उस उपयोगकर्ता को डेटाबेस में खोजने का प्रयास करेगा जिसमें उस विशिष्ट टोकन और कुंजी जोड़ी हों। 'exampleof' जांच करता है यदि परिणाम' उपयोगकर्ता 'वर्ग का उदाहरण है, जिसका अर्थ है कि यह जांच रहा है कि ऐसा उपयोगकर्ता पाया गया है या नहीं। यदि ऐसा है, तो 'do' फिर से निष्पादित करेगा और एक और जोड़ी करेगा, और तब तक जब तक कि कोई उपयोगकर्ता टोकन आईडी/कुंजी की जेनरेट की गई जोड़ी न हो। –

15

टोकन उत्पन्न करने के मामले में, आप Laravel's Helper Functions में से एक का उपयोग कर सकते हैं; str_random()

यह एक निर्दिष्ट लंबाई की एक यादृच्छिक स्ट्रिंग उत्पन्न करेगा, उदाहरण के लिए str_random(16) 16 अक्षरों (ऊपरी मामला, निचला मामला, और संख्या) की एक यादृच्छिक स्ट्रिंग उत्पन्न करेगा।

टोकन का उपयोग करने के तरीके के आधार पर, क्या उन्हें वास्तव में पूरी तरह अद्वितीय होने की आवश्यकता है? यह देखते हुए कि वे किसी उपयोगकर्ता से मेल खाते हैं, या मुझे लगता है कि आप token_id का उपयोग कर रहे हैं और फिर इसे token_key के विरुद्ध सत्यापित कर रहे हैं, क्या वास्तव में कोई फर्क पड़ता है कि उनमें से एक का डबल अप है? - हालांकि इसकी संभावना बहुत कम है!

हालांकि, अगर आपको वास्तव में अद्वितीय होने की आवश्यकता है तो आप हमेशा unique बाधा के साथ एक सत्यापनकर्ता का उपयोग कर सकते हैं। this package का उपयोग करके आप यह भी जांच सकते हैं कि उनमें से दो unique_with के साथ अद्वितीय हैं। और फिर यदि वैधकर्ता विफल रहता है तो यह आवश्यकतानुसार एक नया टोकन उत्पन्न करता है।

अपने उदाहरणों के आधार पर, आप और str_random(30) के लिए token_key के लिए str_random(16) का उपयोग करेंगे।

0

आप ऐसा करने के लिए निर्भरता का उपयोग कर सकते हैं।Dirape laravel-token

भागो आदेश

composer require dirape/token 

अपने नियंत्रक उपयोग

use Dirape\Token\Token; 

आप इसे इस तरह उपयोग कर सकते हैं:

User::create([ 
     'name'    => $data['name'], 
     'email'   => $data['email'], 
     'password'   => bcrypt($data['password']), 
     'token_key' => (new Token())->Unique('users', 'api_token', 60), 
     'active'   => 1 
    ]) 
संबंधित मुद्दे