سؤال

أريد إعداد خادم 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 () إذا كنت تريد استجابة مختلفة لمحاولة تسجيل الدخول الفاشلة. مثل تأخير اصطناعي لمنع هجمات القوة الغاشمة، أو إعادة توجيه.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top