使用 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
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 的版本。每个提供商都有自己的关于实施协议的文档,所以一定要检查一下。