📜  使用 Flask 进行 OAuth 身份验证 – 连接到 Google、Twitter 和 Facebook

📅  最后修改于: 2022-05-13 01:55:48.739000             🧑  作者: Mango

使用 Flask 进行 OAuth 身份验证 – 连接到 Google、Twitter 和 Facebook

在本文中,我们将构建一个使用 OAuth 协议获取用户信息的 Flask 应用程序。首先,我们需要了解 OAuth 协议及其流程。

什么是 OAuth?

OAuth 代表开放授权,旨在实现在线服务之间的连接。 OAuth 社区站点将其定义为“一种开放协议,允许以简单和标准的方法从 Web、移动和桌面应用程序进行安全授权。 ”。 OAuth 的一个流行示例是各种网站上的“使用 Google 登录”按钮。在这里,网站服务与 google 服务连接,为您提供一个简单的选项来授权您的资源使用所需的服务。现在有两个版本的 OAuth OAuth1.0 和 OAuth2.0。

OAuth 中的术语

  • 客户端:它是尝试连接到其他服务的应用程序或服务。
  • 提供者:它是客户端连接到的服务。
  • 授权URL:是客户端向其发送请求的提供商提供的 URL。
  • Client ID 和 Secret:由提供者提供,在客户端向提供者发送授权请求时使用。
  • 授权码:这是在用户成功认证后由客户端检索的代码,并将其发送到提供者的授权服务器。
  • 回调URL:是客户端设置的URL,提供者向其发送授权码,客户端服务检索到用户资源。

设置 OAuth 涉及的步骤

第 1 步:在提供商网站上将您的应用程序注册为客户端。您将收到包含客户端 ID 和客户端密钥的客户端凭据。

第 2 步:客户端应用程序向提供者的授权 URL 发送授权请求。

第 3 步:用户在提供者的站点上对自己进行身份验证,并允许客户端服务使用资源。



第四步:提供者向客户端发送授权码

第五步:客户端向提供者的授权服务器发送授权码。

第 6 步:提供者发送可用于访问用户资源的客户端令牌。

现在 OAuth 的概念很清楚了,我们可以开始构建我们的应用程序了。我们可以使用各种库来实现 OAuth。我们将使用的库是 AuthLib,它支持 OAuth 1.0 和 OAuth 2.0。

安装所需的依赖项

要安装所需的依赖项,请在终端中键入以下命令。

pip install -U Flask Authlib requests

注意:建议在安装这些依赖之前创建一个虚拟环境。

从提供程序检索客户端凭据

  • Google:在 https://console.cloud.google.com/apis/credentials 创建您的 Google OAuth 客户端,确保将 http://localhost:5000/google/auth/ 添加到授权重定向 URI 中。
  • Twitter:通过创建应用程序在 https://developer.twitter.com/ 上创建您的 Twitter Oauth 1.0 客户端。将 http://localhost:5000/twitter/auth/ 添加到授权重定向 URI 中。
  • Facebook:通过创建应用程序,在 https://developer.facebook.com/ 上创建您的 Facebook OAuth 客户端。将 http://localhost:5000/facebook/auth/ 添加到授权重定向 URI 中。

客户端凭据可以直接在程序中使用,但在实际生产中,这些凭据将存储在环境变量中。

创建用户界面

创建一个名为 templates 的文件夹,并在其中创建一个 index.html 文件。将以下代码粘贴到 index.html 文件中。这是一个为每个提供程序创建按钮的简单代码。



HTML


   
      
      
      Authlib Connect
   
   
      

                   
         
                   
         
                   
         
      

       


Python3
from flask import Flask, render_template
 
 
app = Flask(__name__)
 
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<\
!\xd5\xa2\xa0\x9fR"\xa1\xa8'
 
'''
    Set SERVER_NAME to localhost as twitter callback
    url does not accept 127.0.0.1
    Tip : set callback origin(site) for facebook and twitter
    as http://domain.com (or use your domain name) as this provider
    don't accept 127.0.0.1 / localhost
'''
 
app.config['SERVER_NAME'] = 'localhost:5000'
 
@app.route('/')
def index():
    return render_template('index.html')
 
if __name__ == "__main__":
    app.run(debug=True)


Python3
from flask import Flask, render_template
from authlib.integrations.flask_client import OAuth
 
app = Flask(__name__)
 
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O


Python3
# The user details get print in the console.
# so you can do whatever you want to do instead
# of printing it
 
from flask import Flask, render_template, url_for, redirect
from authlib.integrations.flask_client import OAuth
import os
 
app = Flask(__name__)
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O


Python3
# The user details get print in the console.
# so you can do whatever you want to do instead
# of printing it
 
from flask import Flask, render_template, url_for, redirect
from authlib.integrations.flask_client import OAuth
import os
 
app = Flask(__name__)
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O/


Python3
# The user details get print in the console.
# so you can do whatever you want to do instead
# of printing it
 
from flask import Flask, render_template, url_for, redirect
from authlib.integrations.flask_client import OAuth
import os
 
app = Flask(__name__)
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O/


创建 Flask 应用程序

初始化烧瓶应用程序

让我们创建一个简单的 Flask 应用程序,它什么都不做,只是将上面创建的 HTML 文件呈现到主页上。

蟒蛇3

from flask import Flask, render_template
 
 
app = Flask(__name__)
 
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<\
!\xd5\xa2\xa0\x9fR"\xa1\xa8'
 
'''
    Set SERVER_NAME to localhost as twitter callback
    url does not accept 127.0.0.1
    Tip : set callback origin(site) for facebook and twitter
    as http://domain.com (or use your domain name) as this provider
    don't accept 127.0.0.1 / localhost
'''
 
app.config['SERVER_NAME'] = 'localhost:5000'
 
@app.route('/')
def index():
    return render_template('index.html')
 
if __name__ == "__main__":
    app.run(debug=True)

使用以下命令运行服务器以确保应用程序运行成功并显示 index.html 页面。

创建应用程序后,让我们看看如何为 google、Twitter 和 Facebook 添加 Oauth。但首先让我们初始化 OAuth。

初始化 OAuth

蟒蛇3

from flask import Flask, render_template
from authlib.integrations.flask_client import OAuth
 
app = Flask(__name__)
 
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O

在这里,我们使用 OAuth(app) 类初始化了 OAuth,并将服务器名称更改为 localhost:5000。现在让我们看看如何为不同的平台创建 OAuth。

为 Google 创建 OAuth

蟒蛇3

# The user details get print in the console.
# so you can do whatever you want to do instead
# of printing it
 
from flask import Flask, render_template, url_for, redirect
from authlib.integrations.flask_client import OAuth
import os
 
app = Flask(__name__)
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O

为 Twitter 创建 OAuth

蟒蛇3

# The user details get print in the console.
# so you can do whatever you want to do instead
# of printing it
 
from flask import Flask, render_template, url_for, redirect
from authlib.integrations.flask_client import OAuth
import os
 
app = Flask(__name__)
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O/

为 Facebook 创建 OAuth

蟒蛇3



# The user details get print in the console.
# so you can do whatever you want to do instead
# of printing it
 
from flask import Flask, render_template, url_for, redirect
from authlib.integrations.flask_client import OAuth
import os
 
app = Flask(__name__)
app.secret_key = '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O/

运行应用程序

启动服务器:

python app.py

然后访问:

http://localhost:5000/

注意:每个提供程序的 OAuth 配置都不同,并且取决于 OAuth 的版本。每个提供商都有自己的关于实施协议的文档,所以一定要检查一下。