هات ال configuration كي نعرف السبب
شو يعني ؟
يعني ال settings في جانقو… هل غيرتها لتستعمل postgres ؟
"""
Django settings for api project.
Generated by 'django-admin startproject' using Django 2.2.5.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '9*a0#6w_h$48nr@gh!#p@*-vwdn7rttmrl3g3wt_r5)$5!!r0+'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ["*"]
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders', #CORS
'rest_framework', #rest
'rest_framework.authtoken', #acces token
'users.apps.UsersConfig', #app users
'articles.apps.ArticlesConfig', #app articles
]
AUTH_USER_MODEL = 'users.User' # CustomUser
########## acces token && permissions
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', )
}
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', #CORS
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True #CORS
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
# TODO - set this properly for production
'http://localhost:8080',
'http://127.0.0.1:8000',
)
ROOT_URLCONF = 'api.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'api.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
APPEND_SLASH=False # example /api/users/checkusername(/)
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
شوف المقال اللي أرسلته لك… لانه هناك العديد من التعديلات كي يعمل تطبيقك في هيروكو.
أو تفضل هذا الريبو ممكن يساعدك
عم جرب اطبق المقال بخبرك بالتطورات
مشي الحال تم رفع مشروع الdjango
سأبدأ بتجهيز ال vue
لكن كل منهما سيعمل على دومين مستقل في هذه الحالة
الان استطعت أن ارفع كل تطبيق على دومين
https://sohep-alslamat.herokuapp.com/ هنا vue
https://vuango-api.herokuapp.com/api/ هنا api django
الان اريد أن ارفع كلاهما على نفس الموقع لكن لكل منهما بورت مختلف
هل هذا صحيح؟ أم الأفضل أن اتركهما بشكل منفصل؟
https://sohep-alslamat.herokuapp.com/
الموقع أصبح جاهز لكنني ربطت بين الباك ايند والفرنت ايند دون ان يكونوا على نفس الدومين.
ياس الأفضل أن تفصل بينهما في ما يخص هيروكو… هذا ما أقوم به أنا دائما
بالتوفيق أخي صهيب
شكرا لك هشام
وشكراً للجميع على الدعم الفني
لكن لدي سؤال ايه أفضل في الapi
ان نرسل البيانات كparms اما كداتا عادية من خلال طلب post
وما الفرق بين الطريقتين من حيث النتيجة والامان؟
أكيد استعمل POST لكل ال endpoints التي تحتاج إدخال بيانات لأنه أكثر أمانا… حتى هناك بعض ال endpoints الحساسة مثل Logout التي رغم أنها لا تستقبل أي بيانات الا أنه يفضل استعمال POST لأنه أكثر أمانا
ممتاز
اتمنى من خلال النظر الى الموقع ان تعطوني ملاحظاتكم ونصائحكم.
مرحبا صهيب عادةً اي مشروع ستعمل عليه سيكون هناك العديد من المفاتيح التي لا يجب مشاركتها مثل api key او secret key
او المفاتيح التي تحصل عليها من خدمات معينة وخاصة اذا كنت رافع الكود على github
مرة تم حظري من خدمة mailgun لانني شاركت المفتاح السري دون ان انتبه على github لا اعلم كيف اكتشفوا ذلك لكنهم خلال اقل من ٢٤ ساعة قامو بتنبيهي وطالبوني بحذف المفاتيح من المستودع
هناك طريقتان لتجاوز هذه المشكلة
١- قم بإنشاء ملف سميه مثلا secret_keys.py وبداخله ضع جميع الرموز السرية الخاصة بك ثم استدعيها في الملفات اللازمة
from . secret_keys import SECRET_KEY as my_secret_key
SECRET_KEY = my_secret_key
...
وهكذا
لكن لا تنسى ان تعمل ملف gitignore لتخبر الريبو بتجاهل الملفات التي تريد تجاهلها بحيث يبقى محلياً الملف ولا يتم رفعه في المستودع
#inside gitignore
secret_keys.py
...
ماذا لو كنت تتعامل مع الاستضافة مثلا في حالتك هذه heroku هنا ستلجئ لاستخدام متغيرات البيئة ستجدها في اعدادت التطبيق الخاص بك على داشبورد هيروكو داخل الاعدادات في التطبيق
تضيف ال key و value وتحفظ
ثم داخل مشروعك مثلا لو اردت جلب SECRET_KEY الذي حفظته في متغييرات البيئة على الاستضافة
import os
SECRET_KEY = os.environ.get('SECRET_KEY')
لا اعلم ان كان هناك طرق افضل او طرق بديلة لكن هذا سيبعدك عن مخاطر مشاركة المفاتيح السرية واكيد اهل الخبرة @hichem2h @YaserAlnajjar عندهم الحلول
اعتقد انه عندك فكرة عن الموضوع لكن حبيت اشارك الكلام مع جميع الاعضاء لاني واجهت مشاكل في البداية مع هذه المفاتيح
كل التوفيق لك اخي صهيب @sohep
شكراً لك على هذه الملاحظة المهمة
واتمنى ان يتم اغناء الموضوع.
بالمناسبة لو اردت تغيير ال secert الحالي و توليد مفتاح جديد يوجد عدة طرق ومنها
١- افتح terminal or cmd
٢- شغل البايثون
٣- استدعي مكتبة secrets
٤- اكتب هذا السطر
secrets.token_hex(24) ثم انتر سيتولد لديك سيكرت جديد قم باستخدامه
python
>>> import secrets
>>> secrets.token_hex(24)
'f96d659f311484abf7dea198f5075da610c388abfd98f0fc'
طبعا لا تشاركه مع احد،
هناك طرق عديدة لتوليد مفتاح سيكرت جديد
طيب ماذا قد يحصل حين يقوم احد باخذ السكرت؟
والله يا صديقي ما بعتقد اني عندي الاجوبة الكافية لكن بطبيعة الحال من اسمه secret يعني سرّي فالافضل يكون سرّي
ما الاضرار المترتبة بالضبط ماعندي اي فكرة ننتظر اجابات دسمة عن الموضوع
شرح رائع جدا يا سامر، بوركت
بالنسبة لنشر المفاتيح، فكل واحد له أضراره…
مثلا نشر الـ secret keys يعرض بيانات المستخدمين للخطر، فهو يستعمل في عدة أماكن:
https://stackoverflow.com/a/15383766/4565520
JSON object signing
crypto functions for salted hmacs or seeding the random engine which impacts:
password reset token
comment form security to protect against forged POST requests
form security
protect against message tampering as the message framework may use cookies to pass messages between views.
protect session data and create random session keys to avoid tampering as well.
create random salt for most password hashers
create random passwords if necessary
create itself when using startproject
create CSRF key
يعني لو تم سرقة قاعدة البيانات، من الممكن أن يتم فك تشفير جميع بيانات المستخدمين
ولو تم تسريب مفتاح mailgun فيمكن جلب ايميلات مستخدمي موقعك!
والأسوء هو تسرب مفتاح AWS… يمكن عمل سيرفرات على حسابك والتحكم بها، وكل هذا محسوب من رصيد بطاقتك الائتمانية