मैं Laravel पासपोर्ट के साथ एक साधारण एपीआई शुरू करने की कोशिश कर रहा हूँ। मैं इस ट्यूटोरियल का अनुसरण कर रहा हूं मैंने इसे सफलतापूर्वक पूरा कर लिया है, हालांकि जब मैं एक बियरर टोकन निर्दिष्ट किए बिना ब्राउज़र में "http://localhost:8000/api/CEO" तक पहुंचने का प्रयास करता हूं, तो मुझे त्रुटि मिल रही है: Symfony\Component\Routing\Exception\RouteNotFoundException Route [login] not defined.

अब मैं समझता हूं कि अनुरोधों को प्रमाणित करने के लिए वाहक टोकन की आवश्यकता है, लेकिन मैं कैसे सत्यापित कर सकता हूं कि एपीआई अनुरोधों में टोकन है? और यदि वे नहीं करते हैं, तो एक त्रुटि दिखाएं। एक ऐसे लॉगिन पेज पर रीडायरेक्ट करने के बजाय जो मौजूद नहीं है।

0
Ratapof 24 अगस्त 2021, 20:15

2 जवाब

सबसे बढ़िया उत्तर

यदि आप लार्वा गिट भंडार पर एक नज़र डालें तो आपको Authenticate.php मिडलवेयर मिलेगा: https://github.com/laravel/laravel/blob/8.x/app/Http/Middleware/Authenticate.php

/**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }

आपके अंत में जो हो रहा है वह यह है कि आप अपने अनुरोध Accept: application/json में एक बहुत ही महत्वपूर्ण शीर्षलेख खो रहे हैं, इसलिए Laravel उस लॉगिन पृष्ठ पर पुनर्निर्देशित करने का प्रयास कर रहा है जो आपके api.php मार्गों में परिभाषित नहीं है। बस उस हेडर को जोड़कर पोस्टमैन या कुछ इसी तरह के अपने एंडपॉइंट को हिट करें और आपको एक Unauthenticated त्रुटि संदेश प्राप्त होगा।

यदि आप अपने ब्राउज़र से उस URL को खोलना चाहते हैं तो आप अनुरोध को संसाधित करने और 401 त्रुटि संदेश वापस करने के लिए एक मिडलवेयर भी जोड़ सकते हैं। मैंने अपना खुद का मिडलवेयर बनाया है जो यूआरएल द्वारा भेजे गए टोकन को मेरे अनुरोध शीर्षलेखों में जोड़ता है। यदि URL में कोई टोकन मौजूद नहीं है तो 401 त्रुटि फेंक कर निरस्त करें

<?php

namespace App\Http\Middleware;

use Closure;

class ParseTokenFromUrl
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->has('access_token') && !$request->headers->get('Authorization')) $request->headers->set('Authorization', 'Bearer ' . $request->get('access_token'));
        if (!$request->headers->get('Authorization')) abort(401);
        return $next($request);
    }
}

कृपया लारावेल पासपोर्ट रूट [लॉगिन] परिभाषित नहीं को भी देखें।

1
Dharman 24 अगस्त 2021, 22:01

Api.php में "auth:api" मिडलवेयर App/Http/Middleware/Authenticate.php से मेल खाता है।
(यह App/Http/Kernel.php में $routeMiddleware की जांच करके सत्यापित किया जा सकता है)

इस मिडलवेयर में हम जाँच करते हैं: if (! $request->expectsJson()) { return route('login'); } वापसी को में बदलें return abort(502, 'Invalid request');
इसके बजाय एक त्रुटि दिखाने के लिए।

0
Ratapof 24 अगस्त 2021, 21:44