اذهب إلى المحتوى
  • 0

مشكلة Throttle Access في API لارافيل

Amir Alsaeed

السؤال

لدي API مبنية ضمن لارافيل والتي يتم استدعائها من قبل سيرفر آخر خارجي عن طريق Guzzle، ولكن عند الوصول إلى IP السيرفر الآخر تظهر مشكلة Throttle ولايتمكن من إعادة البيانات المطلوبة من الـ API.

الذي أحاول الآن القيام به هو تمرير اسم نطاق الزبون (السيرفر الأساسي) و IP Address للسيرفر الآخر إلى API عن طريق إضافة middleware للتحكم بالاختناق:

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'api' => [
        'throttle:60,1',
        \Barryvdh\Cors\HandleCors::class,
        'bindings',
    ],
];

وهذا هو الكود الخاص بالدالة resolveRequestSignature:

/**
 * Resolve request signature.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return string
 *
 * @throws \RuntimeException
 */
protected function resolveRequestSignature($request)
{
    if ($user = $request->user()) {
        return sha1($user->getAuthIdentifier());
    }
    if ($route = $request->route()) {
        return sha1($route->getDomain().'|'.$request->ip());
    }
    throw new RuntimeException('Unable to generate the request signature. Route unavailable.');
}

ولكن النتيجة تكون دوماً بالحصول على Unable to generate the request signature. Route unavailable. ولم تنجح معالجة الاختناق. كيف يمكنني حل هذه المشكلة؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 2

يجب أن تقوم بتمرير رقم IP Address للزبون مع ترويسة X_FORWARDED_FOR وبهذه الطريقة لن يتم حجب رقم IP Address للسيرفر الثاني.

ويمكن القيام بذلك كالتالي:

Route::get('/', function (Request $request) {

    $client = new \GuzzleHttp\Client();

    $request = $client->request('GET', '/api/example', [
        'headers' => ['X_FORWARDED_FOR' => $request->ip()]
    ]);

    $response = $request->getBody();

});

حيث يتم وضع رقم IP ضمن الترويسة 'X_FORWARDED_FOR.

ثم في السيرفر الأساسي يجب أن تقوم بإضافة عنوان السيرفر الآخر ضمن trusted proxy ضمن المسار التالي:

App\Http\Middleware\TrustProxies

ليتم أخذ عنوان IP Address من الترويسة Header بالشكل المطلوب. ويمكن القيام بذلك كالتالي:

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies = [
        '192.168.1.1', // <-- يتم هنا وضع عنوان السيرفر الثاني
    ];

    //...
}

الآن مع كل عملية استدعاء من الشكل على السيرفر الأول، ستتمكن من الوصول إلى عنوان الزبون Client IP بدلاً من عنوان السيرفر الثاني وبالتالي سيتم التخلص من الاختناق الحاصل:

$request->ip()

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك تمرير عنوان IP الخاص بالعميل برأس X_FORWARDED_FOR ، وبهذه الطريقة لا يتم حظر عنوان IP للخادم الثاني.

Route::get('/', function (Request $request) {

    $client = new \GuzzleHttp\Client();

    $request = $client->request('GET', '/api/example', [
        'headers' => ['X_FORWARDED_FOR' => $request->ip()]
    ]);

    $response = $request->getBody();

});

على خادمك الرئيسي ، تحتاج إلى إضافة خادمك الثاني كخادم موثوق به إلى App \ Http \ Middleware \ TrustProxies من أجل الحصول على IP من هذا العنوان.

class TrustProxies extends Middleware
{
    protected $proxies = [
        '192.168.1.1', // <-- set the ip of the second server here 
    ];
}

الآن كل مكالمة إلى 

$request->ip() 

على الخادم الرئيسي سيكون لها عنوان IP الأصلي للعميل بدلاً من IP الخاص بالخادم الثاني. سيؤثر ذلك أيضًا على throttling.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...