📜  Python Django | Google 身份验证和从头开始获取邮件(1)

📅  最后修改于: 2023-12-03 15:33:59.675000             🧑  作者: Mango

Python Django | Google 身份验证和从头开始获取邮件

在现代Web应用程序中,安全性是至关重要的。一个流行的方法是使用Google身份验证来增强安全性。同时,我们可能需要从头开始获取邮件以在我们的Django应用程序中执行各种操作。在本指南中,我们将一步步实现这些功能。

Google身份验证
创建OAuth客户端ID

首先,我们需要设置OAuth客户端ID。我们可以使用Google云平台控制台来创建客户端ID。根据以下步骤创建OAuth客户端ID:

  1. 在Google云平台控制台中,选择项目并导航到“API和服务”>“凭据”。
  2. 单击“创建凭据”>“OAuth客户端ID”。
  3. 在“应用程序类型”下拉菜单中,选择“Web应用程序”。
  4. 输入任何名称以标识这个OAuth客户端ID。
  5. 在“授权重定向URI”字段中,添加“http://localhost:8000/account/google/login/callback”。
  6. 单击“创建”。
安装Google Python API客户端

我们需要安装Google Python API客户端。我们可以在终端中使用以下命令安装:

pip install google-api-python-client
集成Google身份验证

我们可以使用Django中的django-allauth来实现Google身份验证。按照以下步骤进行集成:

  1. 在我们的Django项目中安装django-allauth。
pip install django-allauth
  1. 在Django的INSTALLED_APPS设置中添加'allauth'、'allauth.account'和'allauth.socialaccount'。
INSTALLED_APPS = [
    ...
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    ...
]
  1. 在Django的AUTHENTICATION_BACKENDS设置中添加'allauth.account.auth_backends.AuthenticationBackend'。
AUTHENTICATION_BACKENDS = [
    ...
    'allauth.account.auth_backends.AuthenticationBackend',
    ...
]
  1. 在Django的settings.py设置中,设置'SOCIALACCOUNT_PROVIDERS'和'AUTHENTICATION_BACKENDS'。
SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'SCOPE': [
            'https://www.googleapis.com/auth/userinfo.profile',
            'https://www.googleapis.com/auth/userinfo.email'
        ],
        'APP': {
            'client_id': 'YOUR_GOOGLE_OAUTH_CLIENT_ID',
            'secret': 'YOUR_GOOGLE_OAUTH_SECRET',
            'key': ''
        }
    }
}

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)

我们需要将'YOUR_GOOGLE_OAUTH_CLIENT_ID'和'YOUR_GOOGLE_OAUTH_SECRET'替换为我们在Google云平台控制台中创建的OAuth客户端ID的客户端ID和密钥。

  1. 在Django的urls.py中添加以下行:
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    ...
    url(r'^accounts/', include('allauth.urls')),
    ...
]
  1. 现在,我们可以使用以下命令启动Django应用程序并访问http://localhost:8000/accounts/google/login/以查看Google登录页面。
python manage.py runserver
  1. 完成上述步骤后,用户可以使用Google登录,我们可以使用以下代码来访问Google API。
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build

def get_google_contacts(request):
  user = request.user
  social = user.social_auth.get(provider='google')
  credentials = Credentials.from_authorized_user_info(social.extra_data)
  service = build('people', 'v1', credentials=credentials)
  results = service.people().connections().list(
        resourceName='people/me',
        pageSize=500,
        personFields='names,emailAddresses').execute()
  connections = results.get('connections', [])
  for person in connections:
    names = person.get('names', [])
    if names:
      name = names[0].get('displayName')
    email_addresses = person.get('emailAddresses', [])
    if email_addresses:
      email = email_addresses[0].get('value')

此示例显示如何获取Google联系人列表。我们正在使用已授权的用户的OAuth 2.0凭据访问API。

从头获取邮箱

在某些情况下,我们需要从头获取电子邮件以在我们的Django应用程序中执行各种操作。为此,我们需要使用IMAP和SMTP。

我们可以使用Python中的内置的imaplib和smtplib库。

使用IMAP获取邮件

我们可以使用以下代码从邮件服务器中获取电子邮件。

import imaplib

M = imaplib.IMAP4_SSL('imap.gmail.com')

try:
  # Login
  M.login('<username>@gmail.com', '<password>')

  # Get mailbox information
  rv, data = M.select('"[Gmail]/All Mail"', readonly=True)
  rv, data = M.search(None, 'ALL')
  ids = data[0].split()
  print(f"Found {len(ids)} messages in {rv}")

  for num in ids:
    rv, data = M.fetch(num, '(RFC822)')
    if rv == 'OK':
      print('Message %s\n%s\n' % (num, data[0][1]))

except Exception as e:
    print("ERROR:", e)

finally:
    M.logout()

此示例显示如何从Gmail获取所有邮件。我们正在使用IMAP库通过电子邮件用户名和密码进行身份验证。

使用SMTP发送电子邮件

我们可以使用以下代码在Django应用程序中使用SMTP发送电子邮件。

import smtplib
from email.mime.text import MIMEText

def send_email():
  body = 'Hello, this is an email!'
  msg = MIMEText(body)
  msg['From'] = '<from-email>'
  msg['To'] = '<to-email>'
  msg['Subject'] = 'Test Email'
  
  try:
    with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
      smtp.ehlo()
      smtp.starttls()
      smtp.ehlo()
      smtp.login('<username>@gmail.com', '<password>')
      smtp.sendmail('<from-email>', '<to-email>', msg.as_string())
  except Exception as e:
    print("ERROR:", e)

这只是一个简单的示例,我们可以自定义电子邮件的HTML格式,包括附件等。

结论

在本指南中,我们学习了如何使用Google身份验证来加强安全性,以及如何从头开始获取电子邮件以在我们的Django应用程序中执行各种操作。我们使用了一些Python库和Django第三方库来实现这些功能。