2015-04-14 18 views
8

के साथ लॉगआउट समस्या मैं अपने एपीआई में एक विश्वसनीय ऑथ संसाधन बनाने के लिए jwt-auth का उपयोग कर रहा हूं। जब कोई क्लाइंट ऐप लॉगिन संसाधन को कॉल करता है, तो केस उपयोगकर्ता लॉग होता है, तो आपका वर्तमान टोकन अमान्य होना चाहिए और इसलिए एक नया टोकन जेनरेट किया जाना चाहिए।लैरावेल जेडब्ल्यूटी-ऑथ प्रमाणीकरण

लेकिन वर्तमान टोकन को ब्लैकलिस्ट किया गया है TokenBlacklistedException फेंक दिया गया है।

टोकन को ब्लैकलिस्ट किए जाने पर कैसे सत्यापित किया जाए? या उपयोगकर्ता को "लॉगआउट" को कार्यान्वित करने के लिए कैसे सही करें? मैं jwt-auth API स्रोत पर खोजने का प्रयास करता हूं लेकिन getToken()->isBlacklisted() या parseToken()->isBlacklisted() या इसे लागू करने के लिए कुछ वैधकर्ता मौजूद नहीं है।

कभी टोकन अमान्य parseToken() एक टोकनब्लैकलिस्टेड अपवाद फेंकता है, इसलिए एक हैकलिस्ट सूची विधि टोकन को अमान्य करने से पहले मान्य है या नहीं, यह सत्यापित करने का एक अच्छा तरीका है।

जानकारी:

bellow कोड सत्यापित करें कि पेलोड अमान्य है, TokenBlacklistedException फेंक दिया है, तो अमान्य है:

if(
    false === \Tymon\JWTAuth\Blacklist::has(
     \Tymon\JWTAuth\Facades\JWTAuth::getPayload($token) 
    ) 
) { 
    \Tymon\JWTAuth\Facades\JWTAuth::parseToken()->invalidate(); 
} 

कैसे लगाएं कि तरह:

if(false ===\Tymon\JWTAuth\Facades\JWTAuth::parseToken()->isBlacklisted()) { 
    // invalidate... 
} 

उत्तर

9

आप बस कर सकते हैं जब वे लॉगआउट करते हैं और बैकएंड पर टोकन को अमान्य करते हैं, तो क्लाइंट पक्ष पर सत्र को नष्ट कर दें, आपको इसका उपयोग करने की आवश्यकता नहीं है काली सूची।

क्लाइंट पक्ष पर टोकन को तकनीकी रूप से नष्ट करना पर्याप्त होगा, लेकिन सत्र अपहरण के लिए, बैकएंड पर इसे अमान्य करना भी एक अच्छा विचार है।

यदि आप अवैध हैं, तो आपको लार्वेल से आपकी प्रतिक्रिया प्राप्त करने के बाद टोकन को नष्ट करने की आवश्यकता होगी।

JWTAuth::invalidate(JWTAuth::getToken())): 

फिर कोणीय तरफ

function logout() 
{ 
    UserService.logout().$promise.then(function() { 
     $cookieStore.remove('userToken'); 
     // redirect or whatever 
    }); 
} 

एक तरह से आप जेडब्ल्यूटी अपवाद संभाल कर सकते हैं सेटअप करने के लिए है laravel में एक EventServiceProvider, यहाँ मेरा कैसा दिखता है:

use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; 
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; 

class EventServiceProvider extends ServiceProvider { 

    /** 
    * The event handler mappings for the application. 
    * 
    * @var array 
    */ 
    protected $listen = [ 
     'tymon.jwt.valid' => [ 
      'App\Events\[email protected]', 
     ], 
     'tymon.jwt.user_not_found' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.invalid' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.expired' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.absent' => [ 
      'App\Events\[email protected]' 
     ] 
    ]; 

    /** 
    * Register any other events for your application. 
    * 
    * @param \Illuminate\Contracts\Events\Dispatcher $events 
    * @return void 
    */ 
    public function boot(DispatcherContract $events) 
    { 
     parent::boot($events); 

     // 
    } 
} 

आप करेंगे अपने app.php में पंजीकरण करें।

फिर मैं प्रत्येक घटना के लिए विधियों के साथ JWTEvents कक्षा को लागू करता हूं। नोट करने के लिए

class JWTEvents extends Event { 

    // Other methods   

    public function invalid() 
    { 
     return response()->json(['error' => 'Token Invalid'], 401); 
     die(); 
    } 
} 

महत्वपूर्ण बात यह है कि हम जेडब्ल्यूटी अपवादों को पकड़ने और एक विशिष्ट स्थिति कोड के साथ एक json प्रतिक्रिया लौट रहे है।

कोणीय पक्ष पर, मेरे पास मेरे httpInterceptor क्लास में है, इन http स्थिति कोडों के लिए कैच करता है।

angular.module('ngApp') 
    .factory('httpInterceptor', function($q, $log, $cookieStore, $rootScope, Response) { 
     return { 

      request: function(config) { 
       // Where you add the token to each request 
      }, 

      responseError: function(response) { 

       // Check if response code is 401 (or whatever) 
       if (response.status === 401) { 
        // Do something to log user out & redirect. 
        $rootScope.$broadcast('invalid.token'); 
       } 
      } 
     } 
    }); 
+0

लेकिन मेरे मामले में, मैं परीक्षण करता हूं कि Angular.js ऐप एक अवैध टोकन भेजता है, इसलिए यदि अमान्य है 'JWTAuth :: अमान्य है (JWTAuth :: getToken()):' टोकनब्लैकलिस्टेड अपवाद को फेंक देगा या कहेंगे कि एक अवैध टोकन । मुझे अमान्य होने से पहले, सत्यापित करें कि यह पहले से ही किया जा चुका है या नहीं। – Maykonn

+0

या जब मैं एक कालबाह्य टोकन को अमान्य करने का प्रयास करता हूं तो TokenExpiredException फेंकता है ... – Maykonn

+0

मैंने यह दिखाने के लिए अपना उत्तर अपडेट किया कि मैं इसे कैसे प्रबंधित कर रहा हूं –

1

जहां तक ​​मैं समझता हूँ, एक बात है कि कोई भी बल दिया 'jwt.refresh' (उर्फ RefreshTokenMiddleware) टोकन ताज़ा करने के लिए प्रयोग किया जाता है।

अब, अगर किसी को जो एक लॉगआउट क्रिया करने के लिए चाहता है की तरह

Route::group(['middleware' => ['jwt.auth', 'jwt.refresh']], function()... 
यकीन लॉगआउट जवाब में नया टोकन मिल जाएगा के लिए

एक मार्ग में नियंत्रक विधि लपेटता इसलिए ग्राहक नए अनुरोधों को निष्पादित करने में सक्षम हो जाएगा ।

आशा है कि यह इस मुद्दे को स्पष्ट करने में मदद कर सकता है।

संबंधित मुद्दे