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

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

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

在Web开发中,OAuth 身份验证是非常常见的一种方式。 它允许用户使用自己的第三方凭据,例如 Google、Twitter 和 Facebook 等,来授权 Web 应用程序访问他们的资源。 在本文中,我们将使用 Flask 和三种不同的身份验证提供程序来演示如何实现 OAuth 身份验证。

准备工作

在开始之前,你需要创建一个虚拟环境并安装所需的包。使用如下命令在终端中创建虚拟环境并激活:

python3 -m venv venv
source venv/bin/activate

在虚拟环境中安装 Flask:

pip install Flask
连接到 Google

首先,我们需要创建一个 Google 应用程序和客户端 ID。

  1. 访问 Google 开发者控制台 并登录您的 Google 帐户。
  2. 点击“创建项目”并为它命名,然后点击“创建”按钮。
  3. 在新创建的项目中,打开“凭据”页面。 点击“创建凭据”按钮并选择“OAuth 客户端 ID”选项。
  4. 在“设置 OAuth 客户端 ID”页面中,选择“网络应用程序”并为其命名。
  5. 在“已授权的 JavaScript 来源”和“已授权的重定向 URI”部分中输入您的应用程序的详细信息。
  6. 点击“创建”按钮并记住您的客户端 ID 和客户端密钥。

现在,我们将创建 Python Flask 应用程序并集成 Google OAuth。

首先,导入 Flask 和其他所需的包:

from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

然后,实例化 Flask 应用程序和 OAuth 对象并设置 Google 客户端 ID 和客户端密钥:

app = Flask(__name__)
app.secret_key = 'random secret'
oauth = OAuth(app)

google = oauth.register(
    name='google',
    client_id='your-client-id',
    client_secret='your-client-secret',
    access_token_url='https://accounts.google.com/o/oauth2/token',
    authorize_url='https://accounts.google.com/o/oauth2/auth',
    api_base_url='https://www.googleapis.com/oauth2/v1/',
    client_kwargs={'scope': 'openid email profile'}
)

此代码将创建一个名为“google”的 OAuth 提供程序。

现在,实现一个路由,以便用户可以使用 Google OAuth 来登录。 这将触发一个重定向到 Google 身份验证服务,并在成功登录后重定向回我们的应用程序并将授权代码传递回我们的应用程序:

@app.route('/google')
def google_login():
    redirect_uri = url_for('google_auth', _external=True)
    return google.authorize_redirect(redirect_uri)

这将重定向用户到 Google 身份验证服务。

接下来,我们需要实现一个路由来接收来自 Google 的授权代码。 我们将使用该代码来交换访问令牌。 然后,我们将使用访问令牌来访问 Google 用户的个人资料:

@app.route('/google/auth')
def google_auth():
    token = google.authorize_access_token()
    resp = google.get('userinfo', token=token)
    if resp.ok:
        profile = resp.json()
        session['profile'] = profile
        session.permanent = True
        return redirect(url_for('dashboard'))
    else:
        return 'Could not fetch your profile information.'

此代码使用 Google OAuth 提供程序交换授权代码以获取访问令牌,并使用访问令牌来访问 Google 用户的个人资料。 如果操作成功,则将个人资料保存在 Flask 会话中并重定向用户到仪表板。 如果操作失败,则返回相应的错误消息。

最后,我们需要实现一个路由来显示仪表板和当前用户的个人资料。 如果用户未登录,则将重定向到 Google OAuth 页面:

@app.route('/dashboard')
def dashboard():
    profile = session.get('profile', None)
    if profile:
        return 'Welcome, {}!'.format(profile['name'])
    else:
        return redirect(url_for('google_login'))

此代码显示当前用户的个人资料,如果用户未登录,则将重定向到 Google OAuth 页面。

连接到 Twitter

为了连接到 Twitter,我们需要创建一个 Twitter 应用程序。

  1. 访问 Twitter 开发者平台 并登录您的 Twitter 帐户。
  2. 单击“应用”,然后单击“创建应用程序”按钮。
  3. 在“创建应用程序”页面中,输入您的应用程序详细信息。
  4. 在“密钥和令牌”选项卡中,复制并记住您的“API 密钥”和“API 密钥密钥”。

现在,我们将创建 Python Flask 应用程序并集成 Twitter OAuth。

首先,导入 Flask 和其他所需的包:

from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

然后,实例化 Flask 应用程序和 OAuth 对象并设置 Twitter 客户端 ID 和客户端密钥:

app = Flask(__name__)
app.secret_key = 'random secret'
oauth = OAuth(app)

twitter = oauth.register(
    name='twitter',
    client_id='your-client-id',
    client_secret='your-client-secret',
    access_token_url='https://api.twitter.com/oauth/access_token',
    authorize_url='https://api.twitter.com/oauth/authorize',
    api_base_url='https://api.twitter.com/1.1/',
    client_kwargs={'scope': ''}
)

此代码将创建一个名为“twitter”的 OAuth 提供程序。

现在,实现一个路由,以便用户可以使用 Twitter OAuth 来登录。 这将触发一个重定向到 Twitter 身份验证服务,并在成功登录后重定向回我们的应用程序并将授权代码传递回我们的应用程序:

@app.route('/twitter')
def twitter_login():
    redirect_uri = url_for('twitter_auth', _external=True)
    return twitter.authorize_redirect(redirect_uri)

这将重定向用户到 Twitter 身份验证服务。

接下来,我们需要实现一个路由来接收来自 Twitter 的授权代码。 我们将使用该代码来交换访问令牌。 然后,我们将使用访问令牌来访问 Twitter 用户的个人资料:

@app.route('/twitter/auth')
def twitter_auth():
    token = twitter.authorize_access_token()
    resp = twitter.get('account/settings.json', token=token)
    if resp.ok:
        profile = resp.json()
        session['profile'] = profile
        session.permanent = True
        return redirect(url_for('dashboard'))
    else:
        return 'Could not fetch your profile information.'

此代码使用 Twitter OAuth 提供程序交换授权代码以获取访问令牌,并使用访问令牌来访问 Twitter 用户的个人资料。 如果操作成功,则将个人资料保存在 Flask 会话中并重定向用户到仪表板。 如果操作失败,则返回相应的错误消息。

最后,我们需要实现一个路由来显示仪表板和当前用户的个人资料。 如果用户未登录,则将重定向到 Twitter OAuth 页面:

@app.route('/dashboard')
def dashboard():
    profile = session.get('profile', None)
    if profile:
        return 'Welcome, {}!'.format(profile['screen_name'])
    else:
        return redirect(url_for('twitter_login'))

此代码显示当前用户的个人资料,如果用户未登录,则将重定向到 Twitter OAuth 页面。

连接到 Facebook

为了连接到 Facebook,我们需要创建一个 Facebook 应用程序和客户端 ID。

  1. 访问 Facebook 开发者平台 并登录您的 Facebook 帐户。
  2. 单击“我的应用程序”并单击“添加新应用程序”按钮。
  3. 在“创建新应用程序”页面中,选择“Web”并为其命名,然后单击“创建应用程序 ID”。
  4. 在“设置”选项卡中,找到您的“应用程序 ID”和“应用程序密钥”并将其复制和保存。

现在,我们将创建 Python Flask 应用程序并集成 Facebook OAuth。

首先,导入 Flask 和其他所需的包:

from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

然后,实例化 Flask 应用程序和 OAuth 对象并设置 Facebook 客户端 ID 和客户端密钥:

app = Flask(__name__)
app.secret_key = 'random secret'
oauth = OAuth(app)

facebook = oauth.register(
    name='facebook',
    client_id='your-client-id',
    client_secret='your-client-secret',
    access_token_url='https://graph.facebook.com/v2.12/oauth/access_token',
    authorize_url='https://www.facebook.com/v2.12/dialog/oauth',
    api_base_url='https://graph.facebook.com/v2.12/',
    client_kwargs={'scope': 'email'}
)

此代码将创建一个名为“facebook”的 OAuth 提供程序。

现在,实现一个路由,以便用户可以使用 Facebook OAuth 来登录。 这将触发一个重定向到 Facebook 身份验证服务,并在成功登录后重定向回我们的应用程序并将授权代码传递回我们的应用程序:

@app.route('/facebook')
def facebook_login():
    redirect_uri = url_for('facebook_auth', _external=True)
    return facebook.authorize_redirect(redirect_uri)

这将重定向用户到 Facebook 身份验证服务。

接下来,我们需要实现一个路由来接收来自 Facebook 的授权代码。 我们将使用该代码来交换访问令牌。 然后,我们将使用访问令牌来访问 Facebook 用户的个人资料:

@app.route('/facebook/auth')
def facebook_auth():
    token = facebook.authorize_access_token()
    resp = facebook.get('/me?fields=id,name,email', token=token)
    if resp.ok:
        profile = resp.json()
        session['profile'] = profile
        session.permanent = True
        return redirect(url_for('dashboard'))
    else:
        return 'Could not fetch your profile information.'

此代码使用 Facebook OAuth 提供程序交换授权代码以获取访问令牌,并使用访问令牌来访问 Facebook 用户的个人资料。 如果操作成功,则将个人资料保存在 Flask 会话中并重定向用户到仪表板。 如果操作失败,则返回相应的错误消息。

最后,我们需要实现一个路由来显示仪表板和当前用户的个人资料。 如果用户未登录,则将重定向到 Facebook OAuth 页面:

@app.route('/dashboard')
def dashboard():
    profile = session.get('profile', None)
    if profile:
        return 'Welcome, {}!'.format(profile['name'])
    else:
        return redirect(url_for('facebook_login'))

此代码显示当前用户的个人资料,如果用户未登录,则将重定向到 Facebook OAuth 页面。