2017-02-03 11 views
0

У меня есть мнение, что генерирует электронную почту на основе формы и отправляет его к трем поставщикам услуг:Encypting SMTP сервер пароль в настройках Джанго

def quote(request): 
    if request.method == 'POST': 
    . 
    . 
    . 
    send_mail(
    'Quote Request: ....', 
    'Message Body', 
    '[email protected]', 
    ['[email protected], [email protected], [email protected]] 
    ) 

В моих настройках у меня есть TLS, хост, пользователь, пароль, и номер порта #:

EMAIL_USE_TLS = True 
EMAIL_HOST = 'stmp.office365.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'My Plain Text Password That I Want to Encrypt Here!' 
EMAIL_PORT = 587 

Процесс отлично работает, но мне нужно зашифровать этот пароль обычного текста. Какой был бы лучший способ сделать это?

+0

Рассмотрите возможность использования переменных среды для хранения информации в секрете. Это руководство поможет вам: [Работа с переменными среды в Python] (https://godjango.com/blog/working-with-environment-variables-in-python/) –

ответ

0

У меня такая же проблема, я имею в виду, что люди всегда имеют пароль происхождения ... пример; используя функцию для выполнения шифрования и возврата исходного пароля к новой переменной, конечно, люди просто печатают эту переменную, чтобы знать исходный пароль ...

Но если вы справитесь с ним, например; form (требуется ввести пароль перед отправкой сообщения электронной почты), я думаю, это возможно ... это то, что было в моей голове.

Django имеет функцию для обработки пароль, то make_password

>>> from django.contrib.auth import hashers 
>>> pwd = hashers.make_password('your-original-password') 
>>> pwd 
'pbkdf2_sha256$30000$74DtkZMARQHr$rC3CEdtDnDjRYE5U2ZRiWxuT+HQf3Aq1KTStpypZDV8=' 
>>> 

Положите в свой settings.py этот закодированный пароль;

EMAIL_HOST_PASSWORD = 'pbkdf2_sha256$30000$74DtkZMARQHr$rC3CEdtDnDjRYE5U2ZRiWxuT+HQf3Aq1KTStpypZDV8=' 

И потом, каждый раз, когда вам нужно отправить сообщение по электронной почте, вам требуется вводить первоначальный пароль, который вы имеете, это условие, чтобы проверить первоначальный пароль hashers.check_password(password, encoded)

Этот сценарий ниже пример как это сделать;

1. forms.py

from django import forms 

class QuoteForm(forms.Form): 
    subject = forms.CharField(widget=forms.TextInput()) 
    message = forms.CharField(widget=forms.Textarea()) 
    password = forms.CharField(widget=forms.PasswordInput()) 
    .... 

2. views.py

from django.shortcuts import render, redirect 
from django.contrib.auth import hashers 
from django.conf import settings 

from yourapp.forms import QuoteForm 

ENCODED_PASSWORD = settings.EMAIL_HOST_PASSWORD 


def quote(request): 
    template_name = 'yourtemplate.html' 

    if request.method == 'POST': 
     form = QuoteForm(request.POST) 
     if form.is_valid(): 
      subject = form.cleaned_data['subject'] 
      message = form.cleaned_data['message'] 

      # in this section is important, 
      # so the password only known by it owner. 
      password = form.cleaned_data['password'] 
      is_matched = hashers.check_password(password, ENCODED_PASSWORD) 
      if is_matched: 
       # change default encoded password from the settings, 
       # with original password from field of `password`. 
       settings.EMAIL_HOST_PASSWORD = password 

       send_mail(
        subject, message, settings.EMAIL_HOST_USER, 
        ['[email protected], [email protected], [email protected]] 
       ) 
       return redirect('/success/page/') 
      return redirect('/password-failed/page/') 
     else: 
      context = {'form': form, 'errors': form.errors} 
      return render(request, template_name, context) 
    else: 
     form = QuoteForm() 
    return render(request, template_name, {'form':form}) 

Я не уверен, что это решение лучше, потому что, конечно, трудно для пользователей.