سؤال

أنا أحاول أن أجد طريقي حول أوث المواصفات ، ومتطلبات أي تطبيقات لا يمكن أن تجد حتى الآن يبدو أكثر صعوبة مما يستحق لأن أواجه صعوبة في العثور على مورد واحد أن يسحب كل ذلك معا.أو ربما انها مجرد أن أنا أبحث عن شيء أكثر تخصصا من معظم الدروس.

لدي مجموعة من واجهات برمجة التطبيقات القائمة--بعض في جافا بعض في PHP-التي أنا الآن في حاجة إلى آمنة لعدد من الأسباب ، أوث يبدو الطريق الصحيح للذهاب.لسوء الحظ عدم القدرة على تعقب الموارد مساعدتي في الحصول على مزود وتشغيلها هي صعبة تلك النظرية.منذ أكثر من هذا سوف يكون نظام إلى نظام استخدام API, سوف تحتاج إلى تنفيذ 2-أرجل مزود.مع أخذ ذلك في الاعتبار...

  1. لا أحد يعرف من أي دروس جيدة لتنفيذ 2-أرجل أوث مزود مع PHP?
  2. بالنظر إلى أن كنت قد القابل للتأمين واجهات برمجة التطبيقات في 2 لغات, هل أنا بحاجة إلى تنفيذ موفر في كل أو هل هناك طريقة لإنشاء مزود بأنه "تحكم الجبهة" أستطيع أن قمع جميع الطلبات من خلال ؟
  3. عند تأمين PHP الخدمات ، على سبيل المثال ، هل يجب تأمين كل API بشكل فردي من قبل بما في ذلك المطلوبة مزود الموارد على كل ؟

شكرا على مساعدتك.

هل كانت مفيدة؟

المحلول

أود أن أتراجع وأفكر فيما يرسله عميل مصادق عليه بشكل صحيح.

هل يمكنك تخزين المفاتيح وبيانات الاعتماد في قاعدة بيانات مشتركة يمكن الوصول إليها من كلتا المجموعتين من الخدمات ، وتنفيذ مزود OAUTH بلغة واحدة؟ عندما يرسل المستخدم طلبًا إلى خدمة (PHP أو Java) ، يمكنك التحقق من المتجر المشترك. عندما يقوم المستخدم بإعداد عميل OAuth ، تقوم بكل ذلك من خلال تطبيق PHP أو Java (تفضيلاتك) ، وتخزين بيانات الاعتماد في DB المشتركة.

هناك بعض مزودي Oauth مكتوب بلغات أخرى قد ترغب في إلقاء نظرة على:

نصائح أخرى

روب لست متأكدا من أين كنت هبطت على هذا ولكن أريد أن أضيف بلدي 2 سنت في حالة أي شخص آخر ركض عبر هذا السؤال.

أنا أكثر أو أقل نفس السؤال قبل بضعة أشهر جلسة استماع حول "أوث" للحصول على أفضل جزء من السنة.لقد تم تطوير بقية API أنا في حاجة إلى تأمين حتى بدأت القراءة عن OAuth...ثم بدأت عيناي على لفة إلى الوراء في رأسي.

ربما أعطاه صلبة جيدة يوم أو 2 من القشط و القراءة حتى قررت كثيرا أن أوث كان مربكا القمامة فقط تخلى عن ذلك.

حتى ذلك الحين بدأت البحث في سبل تأمين واجهات برمجة التطبيقات بشكل عام وبدأت في الحصول على فهم أفضل الطرق للقيام بذلك.الطريقة الأكثر شعبية بدا أن يتم إرسال الطلبات إلى API جنبا إلى جنب مع اختباري من الرسالة بأكملها (المشفرة مع سر وأنت فقط من الخادم أعلم) أن الخادم يمكن أن تقرر ما إذا كانت الرسالة قد تم العبث بها على انها وسيلة من العميل مثل:

  1. يرسل العميل /المستخدم.سلمان/123?showFriends=true&showStats=true&الاختباري=kjDSiuas98SD987ad
  2. خادم يحصل كل ذلك ، يبدو المستخدم "123" في قاعدة البيانات ، الأحمال له المفتاح السري ثم (باستخدام نفس الأسلوب العميل استخدامها) إعادة يحسب نفسه الاختباري نظرا طلب الحجج.
  3. إذا كان الملقم إنشاء الاختباري و العميل إرسال الاختباري تطابق الطلب موافق الإعدام إذا لا يعتبر من العبث و رفض.

المجموع الاختباري يسمى HMAC و إذا كنت تريد مثال جيد على هذا ، هو ما الأمازون خدمات الويب يستخدم (يسمونه حجة 'التوقيع' لا 'الاختباري' على الرغم من).

ذلك بالنظر إلى أن واحدة من المكونات الرئيسية من هذا العمل هو أن العميل و الخادم يجب أن تولد HMAC في نفس الأزياء (وإلا فإنها لن المباراة) ، يجب أن تكون هناك قواعد في كيفية الجمع بين كل الحجج...ثم فهمت فجأة كل ذلك "الطبيعية بايت-يأمر من المعلمات" حماقة من أوث...كان مجرد تحديد قواعد كيفية توليد التوقيع لأنه في حاجة إلى.

نقطة أخرى هي أن كل المعلمة قمت بتضمين في HMAC الجيل هو تلك القيمة ثم لا يمكن العبث بها عند إرسال الطلب.

حتى إذا كنت مجرد ترميز URI الجذعية التوقيع ، على سبيل المثال:

  • /المستخدم.json == askJdla9/kjdas+Askj2l8add

ثم الشيء الوحيد في الرسالة التي لا يمكن العبث بها هو URI كل الحجج التي يمكن العبث بها لأنها ليست جزءا من "الاختباري" القيمة التي سيقوم الملقم إعادة حساب.

بدلا من ذلك, حتى إذا كنت تشمل كل المعلمة في الحساب ، كنت لا تزال عرضة لخطر من "تكرار الهجمات" حيث الخبيثة رجل في منتصف أو evesdropped يمكن اعتراض API المكالمات و تبقي فقط إرسال ذلك إلى الخادم مرارا وتكرارا.

يمكنك إصلاح ذلك عن طريق إضافة طابع زمني (دائما استخدام UTC) في HMAC الحساب كذلك.

تذكير:منذ خادم يحتاج إلى حساب نفس HMAC, يجب أن ترسل على طول أي القيمة التي تستخدم في حساب ما عدا المفتاح السري الخاص بك (أوث تسميه consumer_secret أعتقد).حتى إذا قمت بإضافة الطابع الزمني ، تأكد من إرسال الزمني المعلمة جنبا إلى جنب مع الطلب الخاص بك.

إذا كنت تريد أن تجعل API آمنة من هجمات إعادة التشغيل ، يمكنك استخدام قيمة حالية (هو 1-استخدام الوقت قيمة الخادم يولد ، ويعطي العميل, العميل يستخدم في HMAC, يرسل طلب الملقم يؤكد ثم العلامات التي حالية قيمة "المستخدمة" في DB و لم يسمح طلب آخر استخدامه مرة أخرى).

ملاحظة:'حالية' هل حقا الدقيق الطريق إلى حل "إعادة الهجوم" المشكلة الطوابع كبيرة ، ولكن لأن أجهزة الكمبيوتر لا يكون دائما في المزامنة الزمني القيم ، عليك أن تسمح مقبول نافذة على جانب الملقم كيف "القديمة" طلب قد يكون (مثلا 10 دقيقة, 30 دقيقة, 1 ساعة....يستخدم الأمازون 15mins) قبل قبول أو رفض ذلك.في هذا السيناريو API الخاص بك من الناحية الفنية الضعيفة خلال كامل نافذة من الوقت.

أعتقد حالية القيم العظيمة, ولكن فقط تحتاج إلى استخدامها في واجهات برمجة التطبيقات الحرجة أنها من الحفاظ على سلامتها.في API ، لم أكن في حاجة إليها, ولكن سيكون تافهة أن تضيف في وقت لاحق إذا كان المستخدمون طالب عليه...أنا حرفيا فقط تحتاج إلى إضافة "حالية" الجدول في ديسيبل ، فضح API جديدة للعملاء مثل:

  • /حالية.سلمان

ثم عندما ترسل إلي في HMAC حساب, سوف تحتاج إلى التحقق من DB للتأكد من أنها لم تستخدم من قبل و تستخدم مرة واحدة, وضع علامة على هذا النحو في DB حتى إذا طلب جاء من أي وقت مضى مرة أخرى مع نفس الرقم الاعتباطي أود أن رفض ذلك.

ملخص

على أي حال, لجعل قصة قصيرة طويلة ، كل شيء أنا فقط وصفت هو أساسا ما يعرف باسم "2-أرجل أوث".ليس هناك إضافة خطوة المتدفقة إلى السلطة (Twitter, Facebook, Google, أيا كان) أن يأذن العميل ، أن خطوة إزالة بدلا الخادم ضمنا على ثقة العميل إذا HMAC هو أنهم يرسلون متابعة المباراة.هذا يعني أن العميل لديه الحق secret_key و هو التوقيع على انها رسائل معها, لذلك الخادم على ثقة من ذلك.

إذا كنت تبدأ في النظر حولها على الانترنت يبدو أن هذا هو الأسلوب المفضل لتأمين طرق API في الوقت الحاضر ، أو ما شابه ذلك.الأمازون بالضبط تقريبا يستخدم هذا الأسلوب إلا أنها تستخدم مختلف قليلا الجمع بين طريقة المعلمات الخاصة بهم قبل التوقيع على كل شيء لتوليد HMAC.

إذا كنت مهتما أنا كتبت هذه الرحلة بأكملها و عملية التفكير كما كنت تعلم ذلك.التي قد تساعد في توفير مرشد التفكير جولة من هذه العملية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top