个性化阅读
专注于IT技术分析

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

Google身份验证和从头开始抓取邮件意味着无需使用任何已设置此身份验证过程的模块。我们将使用Google API python客户端和oauth2client由Google提供。有时, 由于没有适当的文档, 使用这些库实施此Google身份验证确实非常困难。但是在完成阅读之后, 事情将会完全清楚。

现在, 我们创建Django 2.0项目, 然后实施Google身份验证服务, 然后提取邮件。我们正在做提取邮件的目的只是为了说明验证身份后如何可以请求许可。

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

第1步:创建Django项目

第一步是创建虚拟环境, 然后安装依赖项。所以我们将使用静脉:

mkdir google-login && cd google-login

python3.5 -m venv myvenv
source myvenv/bin/activate

此命令将创建一个文件夹Myvenv通过它我们才激活了虚拟环境。现在输入

pip freeze

然后, 你必须看到其中没有安装任何依赖项。现在首先要安装Django:

pip install Django==2.0.7

那是我们使用的Django版本, 但可以随意使用任何其他版本。现在, 下一步是创建一个项目, 命名为gfglogin:

django-admin startproject gfglogin .

由于我们位于google-login目录中, 因此我们希望django项目仅位于该当前目录中, 因此你需要使用。末尾表示当前目录。然后创建一个应用程序以将逻辑与主项目分开, 因此创建一个名为gfgauth:

django-admin startapp gfgauth

所以整个终端看起来像:

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

由于我们创建了一个应用程序。将该应用名称添加到settings.pyinINSTALLED_APP清单。现在, 我们正在运行Django项目, 因此我们首先将其迁移, 然后检查是否存在任何错误。

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

因此, 迁移后, 应该可以运行服务器并在该特定URL上查看Django的起始页。

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

第2步:

安装依赖

由于我们的项目已成功运行, 因此我们安装基本要求。首先, 我们需要googleapiclient, 这是必需的, 因为我们必须创建一个资源对象来帮助与API进行交互。因此, 确切地说, 我们将使用它的`build`方法。

安装:

pip install google-api-python-client==1.6.4

现在第二个模块是oauth2client, 这将确保所有身份验证, 凭据, 流以及更多复杂的事情, 因此使用它很重要。

pip install oauth2client==4.1.2

最后安装jsonpickle, (以防万一未安装), 因为它将由oauth2client同时制作CredentalsField.

pip install jsonpickle==0.9.6

因此, 这些是我们唯一需要的依赖项。现在, 让我们进入编码部分, 看看它是如何工作的。

步骤3:

建立模型

使用模型来存储我们从API获得的凭据, 因此只有2个主要字段需要处理。首先是id, 它将是ForeignKey, 第二个是凭据它将等于CredentialsField。该字段需要从oauth2client导入。所以我们models.py看起来像:

from django.contrib import admin
from django.contrib.auth.models import User
from django.db import models
from oauth2client.contrib.django_util.models import CredentialsField
  
  
class CredentialsModel(models.Model):
     id = models.ForeignKey(User, primary_key = True , on_delete = models.CASCADE)
     credential = CredentialsField()
     task = models.CharField(max_length = 80 , null = True )
     updated_time = models.CharField(max_length = 80 , null = True )
  
  
class CredentialsAdmin(admin.ModelAdmin):
     pass ,

目前任务和更新时间只是添加的额外字段, 因此可以删除。因此, 此凭证将凭证数据保存在数据库中。

重要准则:

当我们导入

凭证字段

, 然后自动

__在里面__

方法在后面执行, 如果你注意到路径中的代码

/google-login/myvenv/lib/python3.5/site-packages/oauth2client/contrib/django_util/__init__.py

233行

他们正在导入urlresolvers, 以便可以使用其中的反向方法。现在的问题是, 在Django 1.10或Django 1.11之后, 此urlresolvers已被删除。如果你在Django 2.0上工作, 则会出现一个错误, 指出找不到urlresolvers或不在那里。

现在要解决此问题, 我们需要更改2行, 首先替换该导入从django.core导入urlresolversto从django.urls导入反向

然后替换411行urlresolvers.reverse(…)to逆转(…)

现在你应该能够成功运行它。

创建这些模型之后:

python manage.py makemigrations
python manage.py migrate

步骤4:

创建视图

目前, 我们只有3个主要视图来处理请求。首先是显示主页, 状态, Google按钮, 以便我们可以发送身份验证请求。单击google按钮时将触发第二个视图, 这意味着AJAX请求。第三是处理Google的退货请求, 以便我们可以接受来自它的access_token并将其保存在我们的数据库中。

首先, 我们来做Google身份验证:

因此, 现在我们需要指定到API的流程, 我们需要询问哪些权限, 什么是我的秘密密钥和重定向URL。为此, 请输入:

FLOW = flow_from_clientsecrets(
    settings.GOOGLE_OAUTH2_CLIENT_SECRETS_JSON, scope='https://www.googleapis.com/auth/gmail.readonly', redirect_uri='http://127.0.0.1:8000/oauth2callback', prompt='consent')

如你所见设置。GOOGLE_OAUTH2_CLIENT_SECRETS_JSON, 所以去settings.py文件和类型:

GOOGLE_OAUTH2_CLIENT_SECRETS_JSON = 'client_secrets.json'

这告诉DjangoJSON文件存在。我们稍后将下载此文件。指定流程后, 让我们开始逻辑。

每当我们需要查看某人是否被授权时, 我们都会首先检查数据库是否已存在该用户凭据。如果不是, 那么我们向API url发出请求, 然后获取凭据。

def gmail_authenticate(request):
     storage = DjangoORMStorage(CredentialsModel, 'id' , request.user, 'credential' )
     credential = storage.get()
  
     if credential is None or credential.invalid:
         FLOW.params[ 'state' ] = xsrfutil.generate_token(settings.SECRET_KEY, request.user)
         authorize_url = FLOW.step1_get_authorize_url()
         return HttpResponseRedirect(authorize_url)
     else :
         http = httplib2.Http()
         http = credential.authorize(http)
         service = build( 'gmail' , 'v1' , http = http)
         print ( 'access_token = ' , credential.access_token)
         status = True
  
         return render(request, 'index.html' , { 'status' : status})

我们使用DjangoORMStorage(由oauth2client), 以便我们可以从Django数据存储区存储和检索凭证。因此, 我们需要为其传递4个参数。首先是其中具有CredientialsField的模型类。第二个是具有凭据的唯一ID, 表示凭据的名称, 第三个是具有凭据的密钥值, 最后一个是我们在中指定的CredentialsField的名称models.py.

然后, 我们从存储中获取值, 并查看其是否有效。如果无效, 那么我们将创建一个用户令牌并获得一个用于授权url的令牌, 然后将用户重定向到Google登录页面。重定向后, 用户将填写表格, 并在用户获得Google授权后, Google会将数据发送到回调网址与access_token我们稍后会做。现在以防万一, 如果已经存在用户凭据, 则它将重新验证凭据, 并在上一个过期的情况下还给你access_token或有时还刷新的access_token。

现在, 我们需要处理回调URL, 以执行以下操作:

def auth_return(request):
     get_state = bytes(request.GET.get( 'state' ), 'utf8' )
     if not xsrfutil.validate_token(settings.SECRET_KEY, get_state, request.user):
         return HttpResponseBadRequest()
  
     credential = FLOW.step2_exchange(request.GET.get( 'code' ))
     storage = DjangoORMStorage(CredentialsModel, 'id' , request.user, 'credential' )
     storage.put(credential)
  
     print ( "access_token: % s" % credential.access_token)
     return HttpResponseRedirect( "/" )

现在在回调URL中, 当我们从Google得到一个响应时, 我们捕获数据并从中获取状态, 状态不过是我们由generateToken生成的令牌。因此, 我们要做的是使用secret_key验证令牌, secret_key是我们生成的令牌, 并且是与生成令牌的用户一起使用的。这些东西得到了验证xsrfutil.validate_token确保令牌在时间上不会太旧并且仅在给定的特定时间生成的方法。如果这些操作都无法正常进行, 则会给你带来错误, 否则, 你将继续执行下一步, 与Google共享来自回调响应的代码, 以便获取access_token。

因此, 这是两步验证, 并且在成功获取凭据后, 我们使用DjangoORMStorage将其保存在Django数据存储中, 因为只有这样我们才能获取凭据并将其存储到CredentialsField中。一旦我们将其存储, 就可以将用户重定向到任何特定页面, 这就是获取access_token的方式。

现在, 我们创建一个主页, 该页面将告诉用户是否已登录。

def home(request):
     status = True
  
     if not request.user.is_authenticated:
         return HttpResponseRedirect( 'admin' )
  
     storage = DjangoORMStorage(CredentialsModel, 'id' , request.user, 'credential' )
     credential = storage.get()
  
     try :
         access_token = credential.access_token
         resp, cont = Http().request( "https://www.googleapis.com/auth/gmail.readonly" , headers = { 'Host' : 'www.googleapis.com' , 'Authorization' : access_token})
     except :
         status = False
         print ( 'Not Found' )
  
     return render(request, 'index.html' , { 'status' : status})

现在, 我们假设该用户已在Django中进行了身份验证, 这意味着该用户不再是匿名用户, 并且已将信息保存在数据库中。现在, 为了支持匿名用户, 我们可以删除数据库中凭据的检查或创建一个临时用户。

回到主视图, 首先我们将检查用户是否已通过身份验证, 这意味着该用户不是匿名用户, 如果是, 则让他登录, 否则先检查凭据。如果用户已经从Google登录, 则状态将显示为True, 否则将显示False。

现在来看模板, 我们来创建一个。首先转到根文件夹并创建一个名为”模板”的文件夹, 然后在其中创建index.html:

{% load static %}
<!DOCTYPE html>
<html lang = "en">
  
<head>
     <meta charset = "UTF-8">
     <script src = "{% static 'js/main.js' %}"></script>
     <title>Google Login</title>
</head>
<body>
  
<div>
     <div>
         {% if not status %}
             <a href = "/gmailAuthenticate" onclick = "gmailAuthenticate()" title = "Google">Google</a>
         {% else %}
             <p>Your are verified</p>
         {% endif %}
     </div>
  
</div>
</body>
</html>

现在, 此页面已大大简化, 因此没有CSS或样式, 只需检查一个简单的链接即可。现在你会注意到js文件也。所以再次转到根文件夹并创建一个目录静态/ js /

在里面js创建一个JavaScript文件main.js:

function gmailAuthenticate(){
     $.ajax({
         type: "GET" , url: "ajax/gmailAuthenticate" , //data: '', success: function (data) {
             console.log( 'Done' )
         }
     });
};

这个

js文件

用于将逻辑与HTML文件分开, 还用于对Django进行一次AJAX调用。现在, 我们已经完成了所有部分以供查看。

步骤5:

创建网址和基本设置

在主项目中, URL表示gfglogin/urls.py编辑并放入:

from django.contrib import admin
from django.urls import path, include
  
urlpatterns = [
     path( 'admin/' , admin.site.urls), path(' ', include(' gfgauth.urls')), ]

因为我们需要测试gfgauth应用程序的正常工作。现在里面gfgauth/urls.py类型如下:

from django.conf.urls import url
from . import views
  
urlpatterns = [
     url(r '^gmailAuthenticate' , views.gmail_authenticate, name = 'gmail_authenticate' ), url(r '^oauth2callback' , views.auth_return), url(r '^$' , views.home, name = 'home' ), ]

如你所见, gmailAuthenticate用于AJAX调用, oauth2callback用于回调URL, 最后一个是主页URL。现在, 在运行之前, 我们没有谈论过一些设置:

Insettings.py你需要编辑:

  1. 在模板列表中的DIRS列表中添加”模板”。
  2. 在settings.py文件的最后添加:
    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'static'), )
    
    GOOGLE_OAUTH2_CLIENT_SECRETS_JSON = 'client_secrets.json'
    

因此, 我们仅指定了模板和静态文件的位置, 最重要的是google oauth2客户机密json文件的位置。现在, 我们将下载此文件。

步骤6:

生成Oauth2客户端机密文件

前往Google Developer Console页面并创建一个项目, 并随便命名。创建完毕后, 转到项目仪表板, 然后单击左上方的”导航”菜单。然后单击API服务, 然后单击凭据页面。单击创建凭据(你可能需要先设置产品名称, 然后再进行设置)。现在选择Web应用程序, 因为我们使用的是Django。在此之后指定名称, 然后只需转到重定向URI, 然后在那输入:

http://127.0.0.1:8000/oauth2callback

然后保存。你无需指定Authorized Javascript的来源, 因此暂时将其留空。保存后, 你将能够查看所有凭据, 只需下载凭据, 它就会以一些随机名称保存, 因此只需重新格式化文件名并键入” client_secrets”, 并确保其为json格式即可。然后将其保存并粘贴到Django项目根文件夹(存在manage.py)。

步骤7:

运行它

现在重新检查一切是否正确。确保已迁移它。同样在继续创建一个超级用户之前, 你将不再是匿名用户:

python3.5 manage.py createsuperuser

输入所有必要的详细信息, 然后执行以下操作:

python3.5 manage.py runserver

并转到http://127.0.0.1:8000

你将看到:

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

很好, 现在在这里键入你的超级用户凭据, 然后你将能够看到管理仪表板。请避免这种情况, 然后再次转到http://127.0.0.1:8000

现在你应该可以看到Google链接, 单击它, 你将看到:

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

现在你可以看到它说登录以继续GFG, 这里GFG是我的项目名称。因此工作正常。现在输入你的凭据, 提交后, 你将看到:

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

由于我们要求获得邮件许可, 因此它要求用户允许它。如果显示错误, 则可能需要在Google控制台中将Gmail API激活到项目中。现在, 一旦允许, 你将获得凭据并将其保存在数据库中。如果用户单击”取消”, 则你将需要编写更多代码来处理这种流程。

现在, 如果你允许的话, 你将可以在控制台/数据库上看到access_token。获取access_token后, 你可以利用它来获取用户电子邮件和所有其他内容。

首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。


赞(0)
未经允许不得转载:srcmini » Python Django Google身份验证和从头开始获取邮件
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!