关于“Python实现登录接口的示例代码”的完整攻略,我来为你介绍。
什么是登录接口
登录接口指的是用户登录的接口,即用户输入账号和密码,服务器校验用户身份并返回一个身份鉴权凭证(token),后续用户请求接口时需要携带该凭证,才能调用相应的接口实现用户数据的获取和操作。
实现登录接口的步骤
实现登录接口的步骤大致包括以下几个方面:
- 接受前端发送的登录请求,获取账号和密码;
- 对账号和密码进行验证;
- 如果账号和密码正确,生成一个鉴权凭证(token);
- 将鉴权凭证返回给前端。
接下来具体介绍实现步骤:
1. 接受前端发送的登录请求,获取账号和密码
在Flask框架中,我们可以通过如下代码实现一个登录接口:
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
# TODO: 验证账号密码
# TODO: 生成鉴权凭证
# TODO: 返回鉴权凭证
上述代码中,我们使用了 Flask 框架提供的 @app.route 装饰器创建一个路由为 '/login' 的接口,利用request模块获取请求中的账号和密码。
2. 对账号和密码进行验证
验证账号密码的方式有很多种,比如简单的基于数据文件的明文方式、基于数据库的加密方式、基于第三方认证服务的OAuth方式等等。这里我们以明文方式进行示例。即把账号密码固定存储在数据文件中,用用户输入的账号密码去和存储中的账号密码进行比对,如下所示:
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
# 读取存储在线账号密码的文件
with open('accounts.txt', 'r') as f:
accounts = f.readlines()
# 去掉账号列表中每个账号的 \n 换行符
accounts = [x.strip('\n') for x in accounts]
# 分别获取账号和密码列表
usernames = [x.split(':')[0] for x in accounts]
passwords = [x.split(':')[1] for x in accounts]
# 验证账号和密码
if username in usernames and password == passwords[usernames.index(username)]:
# TODO: 生成鉴权凭证
# TODO: 返回鉴权凭证
return '登录成功!'
else:
return '账号或密码错误!'
上面代码中,我们用 with open()
读取一个在线账号密码的文件,然后将每行用 split()
转化后分别存入用户名和密码列表中,再对比用户输入的用户名和密码是否与在账号密码中匹配,如果匹配则进行鉴权、返回鉴权凭证,否则返回账号或密码错误信息。
3. 如果账号和密码正确,生成一个鉴权凭证(token)
验证账号和密码正确后,我们需要生成一个鉴权凭证供后续接口使用。鉴权方式也有多种,比如JWT、OAuth2等。这里我们以JWT方式进行示例。即在python中使用jwt库生成token,并将token进行返回,如下所示:
import jwt
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
…
# 验证账号和密码
if username in usernames and password == passwords[usernames.index(username)]:
# 生成鉴权凭证
token = jwt.encode({'username': username}, 'secret', algorithm='HS256')
# 返回鉴权凭证
return {'token': token}
else:
return '账号或密码错误!'
由此我们完成了JWT鉴权的示例,其它的方式实现可参照相关的文档。
4. 将鉴权凭证返回给前端
最后一步,将鉴权凭证返回给前端,供后续接口使用,如下所示:
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
...
# 验证账号和密码
if username in usernames and password == passwords[usernames.index(username)]:
# 生成鉴权凭证
token = jwt.encode({'username': username}, 'secret', algorithm='HS256').decode()
# 返回鉴权凭证
return {'token': token}
else:
return '账号或密码错误!'
示例说明
下面提供两个使用示例,并通过Python requests
模块(需额外安装)模拟调用API获取数据的实现方式:
示例1: 明文账号密码
在上面的示例中,我们采用了明文账号密码存储的方式。可直接使用账号密码判断,也可通过外部接口进行认证。这里以内部接口的方式进行示例。
accounts.txt
文件存储在当前文件夹中,文件内容为:
lucy:123456
tom:654321
登录请求
import requests
url = 'http://localhost:8000/login'
data = {'username': 'tom', 'password': '654321'}
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
response = requests.post(url, headers=headers, data=data)
print(response.json())
获取数据请求
import requests
url = 'http://localhost:8000/data'
headers = {'Authorization': 'Bearer ' + 'token字符串'}
response = requests.get(url, headers=headers)
print(response.json())
经过过鉴权后,即可调用接口,例如一个名为 /data
的接口。
示例2: OAuth2
OAuth2是目前互联网上使用最广泛的一种账号认证方式,它将账号密码隔离在第三方授权服务器中,让最终服务端获得一个结构简单、易于校验的令牌(access_token),从而实现授权。下面我们来通过Google OAuth2 API进行示例。
登录请求
首先,我们需要生成一个 Google OAuth 2.0 client ID 。然后将下面的代码保存到文件 google_login.py
中,先执行 python google_login.py
并访问授权链接授权,会自动输出你的access_token字符串。
from google.oauth2 import id_token
from google.auth.transport import requests
AUDIENCE = 'https://mymachine.local:5500/oauth2callback'
CLIENT_ID = 'your_client_id.apps.googleusercontent.com'
response = input('Enter Google auth response:')
idinfo = id_token.verify_oauth2_token(response, requests.Request(), CLIENT_ID)
if idinfo['aud'] != AUDIENCE:
raise ValueError('Could not verify audience.')
# Successful authentication, log user in
print(idinfo['sub'])
print(response)
获取数据请求
上面获取 access_token 后,即可构造如下的HTTP请求进行接口调用:
import requests
headers = {'Authorization': 'Bearer ' + access_token}
response = requests.get('http://localhost:8000/data', headers=headers)
print(response.json())
以上就是Python实现登录接口的示例代码的完整攻略,如果还有疑问,可以继续提出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现登录接口的示例代码 - Python技术站