مصادقة HTTP في خادم محرك المحرك
-
19-09-2019 - |
سؤال
أريد إعداد خادم EPP Engine Dev، بحيث يتوفر لأشخاص آخرين لمعاينة.
ما أود القيام به حقا قبل أن تمكين مصادقة HTTP لأي عنوان URL الذي يتم تقديمه من هذا الموقع. لا أريد أي شخص الوصول إلى الخدمة دون اجتياز تلك المرحلة. يمكنني بالطبع بناء مصادقة HTTP الخاصة بي في التطبيق الذي أتطور فيه، لكن هذا ليس حلا مثاليا، لأنني لا أحتاج إلى هذه الميزة عند نشر التطبيق.
هل هناك أي طريقة جيدة لحلها؟
المحلول
هل تستخدم جافا أو بيثون؟
إذا كنت تستخدم Python، فيمكنك استخدام WSGI الوسيطة الموجودة لمعالجة مصادقة HTTP الأساسية. فيما يلي بعض الخيارات:
نصائح أخرى
نشر التطبيق إلى خوادم Appengine، ولكن استخدام معرف تطبيق مختلف من المرء الذي ستعمل فيه في النهاية في الإنتاج. وبهذه الطريقة، لا تضطر إلى تطوير أي آلية مصادقة إضافية، ولا داعي للقلق بشأن مدى جودة خادم Dev App الخاص بالتحميل متعدد المستخدمين.
لا تجعل dev_appserver يمكن الوصول إليها علنا. إنه غير مصمم لذلك، وليس آمنا. لتسمية مشكلة واحدة فقط، يمكن لأي زائر الذهاب إلى yourhost / _ah / admin / and mess مع datastore الخاص بك، واقتراحات المصادقة بالنظرية المفقودة لن تمنعها.
إذا كان عليك القيام بذلك تماما، فقم بإعداد Apache أو WebServer آخر كوكيل عكسي، وتنفيذ المصادقة ومنع الوصول إلى عناوين URL للوصول إلى / _ah. إن اقتراح بيتر لنشره لمحرك التطبيق هو أفضل بكثير.
إليك عملية تنفيذية قوية جاءت
من خلال بحثي، وجدت طن من التطبيقات القذرة / غير المكتملة ل Bassauth for Gae Online. نتيجة لذلك، انتهى بي الأمر كتابة بلدي. هذا هو أفضل / أبسط نهج تمكنت من الخروج حتى الآن.
أنا أعتبر أنها "ممارسات جيدة" للحفاظ على طلب المعالجات رقيقة قدر الإمكان. لخفض الغليمة و copypasta في المعالجين أنفسهم قرروا تنفيذ المصادقة كديكور. لاستخدامها، قم فقط بإرفاق Decorator بأساليب Handler's Get / Post / Delete.
علي سبيل المثال:
from decorators import basic_auth
class Handler(webapp2.RequestHandler):
@basic_auth
def get(self):
# load your page here
ثم أضف Decorator إلى Decorators.py:
import base64
import os
from webapp2_extras import security
import yaml
def basic_auth(func):
def callf(webappRequest, *args, **kwargs):
# Parse the header to extract a user/password combo.
auth_header = webappRequest.request.headers.get('Authorization')
# if the auth header is missing popup a login dialog
if auth_header == None:
__basic_login(webappRequest)
else:
(username, password) = base64.b64decode(auth_header.split(' ')[1]).split(':')
if(__basic_lookup(username) == __basic_hash(password)):
return func(webappRequest, *args, **kwargs)
else:
__basic_login(webappRequest)
return callf
def __basic_login(webappRequest):
webappRequest.response.set_status(401, message="Authorization Required")
webappRequest.response.headers['WWW-Authenticate'] = 'Basic realm="Secure Area"'
def __basic_lookup(username):
accounts_file = os.getcwd() + os.sep + 'app' + os.sep + 'accounts.yaml'
stream = file(accounts_file, 'r')
for account in yaml.load(stream):
if account['username'] == username:
return account['password']
def __basic_hash(password):
return security.hash_password(password, method='sha1')
ملاحظة: يتم استخدام البادئة تحت إبطال مضاعفة هنا على الوظائف التي لا ينبغي أن تكون مرئية خارج وحدة "الديكور".
في هذه الحالة، ستنظر محاولة تسجيل الدخول الفاشلة ببساطة مربع حوار تسجيل دخول آخر، وأنا مصادق على استخدام كلمة مرور مخزنة في ملف حساب منفصل. ويتم تخزين كلمات المرور في نموذج هزلي SHA1.
يتم كتابة التعليمات البرمجية المراد تخصيصها بسهولة:
- تعديل __basic_lookup () إذا كنت بحاجة إلى تخزين كلمات المرور الخاصة بك في مكان آخر (قاعدة بيانات EX).
- تعديل __basic_hash () إذا كانت كلمات المرور الخاصة بك نص أو مشفرة باستخدام طريقة مختلفة.
- تعديل __basic_login () إذا كنت تريد استجابة مختلفة لمحاولة تسجيل الدخول الفاشلة. مثل تأخير اصطناعي لمنع هجمات القوة الغاشمة، أو إعادة توجيه.