
树莓派 Python Flask 服务与 ArkUI - X 的跨域认证方案之 Http 组件 header 配置
一、跨域认证基本概念
在现代应用开发中,当前端应用(如 ArkUI - X 开发的应用)与后端服务(如树莓派上的 Python Flask 服务)部署在不同的域名、端口或协议下时,就会产生跨域问题。而跨域认证则是在这种跨域场景下,实现用户身份验证和授权的过程,其中 Http 组件的 header 配置是解决跨域认证问题的关键环节。合理的 header 配置能够让前端和后端在跨域环境下安全、有效地传递认证信息,确保只有合法的用户才能访问相应的资源。
二、树莓派 Python Flask 服务端 header 配置
(一)使用 flask - cors 库
首先需要安装 flask - cors 库,通过 pip 命令即可完成安装:pip install flask - cors。
(二)具体配置代码
from flask import Flask, request, jsonify
from flask_cors import CORS, cross_origin
app = Flask(name)
配置跨域资源共享
cors = CORS(app)
app.config[‘CORS_HEADERS’] = ‘Content - Type’
允许携带认证信息的header,这里以常见的Authorization为例
@app.after_request
def after_request(response):
response.headers.add(‘Access - Control - Allow - Headers’, ‘Authorization, Content - Type, X -Requested - With’)
response.headers.add(‘Access - Control - Allow - Methods’, ‘GET, POST, PUT, DELETE, OPTIONS’)
response.headers.add(‘Access - Control - Allow - Credentials’, ‘true’)
return response
示例路由,处理认证相关请求
@app.route(‘/api/auth’, methods=[‘POST’])
@cross_origin()
def auth():
# 处理认证逻辑
token = ‘your_auth_token’ # 这里是模拟生成的token,实际应用中应根据认证逻辑生成
return jsonify({‘token’: token, ‘message’: ‘认证成功’})
if name == ‘main’:
app.run(host=‘0.0.0.0’, port=5000, debug=True)
(三)配置说明
CORS(app):基本启用跨域支持。
app.config[‘CORS_HEADERS’] = ‘Content - Type’:设置跨域请求的头部内容类型。
after_request装饰器中的配置:
Access - Control - Allow - Headers:指定允许携带的请求头,包括Authorization(用于传递认证令牌)、Content - Type(请求内容类型)、X -Requested - With(通常是 XMLHttpRequest)。
Access - Control - Allow - Methods:允许的 HTTP 请求方法,如 GET、POST 等。
Access - Control - Allow - Credentials:设置为true表示允许携带凭证(如 cookie),这在跨域认证中很重要。
三、ArkUI - X 客户端 Http 组件 header 配置
(一)认证信息获取与存储
在 ArkUI - X 应用中,首先需要获取认证令牌(token),并将其存储在合适的位置,以便在后续请求中使用。例如,可以在登录成功后将 token 存储在全局状态或本地存储中。
(二)发送带认证 header 的请求
import http from ‘@ohos.net.http’;
import common from ‘@ohos.app.ability.common’;
// 发送带认证header的请求函数
export function sendAuthenticatedRequest(url: string, method: string, data?: any) {
return new Promise((resolve, reject) => {
// 从存储中获取token,这里假设从全局状态获取
const token = getGlobalToken();
if (!token) {
reject(new Error(‘未获取到认证令牌’));
return;
}
let httpRequest = http.createHttp();
let requestOption = {
method: method,
header: {
'Content - Type': 'application/json',
'Authorization': `Bearer ${token}` // 设置Authorization header,携带token
},
readTimeout: 10000,
connectTimeout: 10000,
// 根据请求方法设置请求体
...(method !== 'GET' && method !== 'HEAD' ? { body: { json: data } } : {})
};
httpRequest.request(
url,
requestOption,
(err: http.HttpError, data: http.HttpResponse) => {
if (err) {
reject(err);
return;
}
// 处理响应数据
let result = '';
if (data.resultCode === http.HttpResultCode.OK) {
if (data.responseCode === 200) {
// 读取响应数据
data.result.on('data', (chunk: ArrayBuffer) => {
result += new TextDecoder().decode(chunk);
});
data.result.on('end', () => {
resolve(JSON.parse(result));
});
} else {
// 处理非200状态码的情况
reject(new Error(`请求失败,状态码:${data.responseCode}`));
}
} else {
reject(new Error(`请求处理错误:${err.message}`));
}
}
);
// 取消请求的逻辑(可选)
// const cancelRequest = () => {
// httpRequest.destroy();
// };
});
}
// 模拟获取全局token的函数
function getGlobalToken(): string | null {
// 实际应用中应从全局状态或本地存储中获取
return ‘your_stored_token’;
}
(三)配置说明
‘Authorization’: Bearer ${token} :设置 Authorization 请求头,使用 Bearer 认证方案,将获取到的 token 添加到 header 中,这是跨域认证中传递认证信息的常用方式。
‘Content - Type’: ‘application/json’:设置请求内容的类型为 JSON,根据实际接口需求可能需要调整为其他类型,如form - data等。
readTimeout和connectTimeout:设置读取超时和连接超时时间,避免请求长时间阻塞。
四、跨域认证注意事项
(一)预检请求处理
在跨域请求中,浏览器可能会先发送一个 OPTIONS 方法的预检请求,以确认服务器是否允许该跨域请求。Flask 服务端的 flask - cors 库会自动处理预检请求,但需要确保上述配置中的Access - Control - Allow - Headers和Access - Control - Allow - Methods等设置正确,以响应预检请求。
(二)token 安全
在传输过程中,确保使用 HTTPS 协议,防止 token 被窃取。
客户端存储 token 时,应根据平台安全要求选择合适的存储方式,避免明文存储。
服务端应设置 token 的过期时间,并提供刷新 token 的机制,以增强安全性。
(三)错误处理
在客户端和服务端都应做好完善的错误处理机制。客户端要处理请求失败、认证失败等情况,如提示用户重新登录;服务端要对非法的认证请求进行正确的响应和日志记录。
(四)环境配置
在开发和生产环境中,可能需要不同的跨域配置。例如,开发环境可以允许所有域名访问,而生产环境则应严格限制允许的域名,可通过 Flask 的配置变量来实现不同环境的配置切换。
以上方案涵盖了服务端和客户端的 header 配置。你可以说说对这个方案的看法,比如是否要调整某些配置,或有其他特殊需求,我来进一步优化。
