我有一个使用 OpenAI 的应用程序,和许多其他应用程序一样,我的密钥最近被泄露了。
我有这个简单的代码:
const functions = require('firebase-functions');
const OpenAI = require("openai");
const openai = new OpenAI({
apiKey: functions.config().openai.key,
});
exports.generateText = functions.https.onCall(async (data, context) => {
try {
const response = await openai.chat.completions.create({
messages: [{ role: 'user', content: data.prompt }],
model: 'gpt-3.5-turbo',
});
return { response: response.choices[0].message.content };
} catch (error) {
throw new functions.https.HttpsError('internal', 'Failed to generate text from OpenAI.');
}
});
然后我在我的 iOS 应用程序中调用如下:
let functions = Functions.functions()
func generateText(prompt: String, completion: @escaping (String?, Error?) -> Void) {
functions.httpsCallable("generateText").call(["prompt": prompt]) { result, error in
if let error = error as NSError? {
if error.domain == FunctionsErrorDomain {
let code = FunctionsErrorCode(rawValue: error.code)
let message = error.localizedDescription
let details = error.userInfo[FunctionsErrorDetailsKey]
print(code, message, details)
return
}
}
if let textResponse = (result?.data as? [String: Any])?["response"] as? String {
completion(textResponse, nil)
} else {
completion(nil, NSError(domain: "AppErrorDomain", code: -1, userInfo: [NSLocalizedDescriptionKey: "Failed to parse function response"]))
}
}
}
但是,由于我不是后端工程师,我想知道这是否安全,或者如何阻止某人使用此端点?例如。这是否会自动限制为从我的应用程序调用?有办法做到吗?
我注意到其他响应要求通过登录对用户进行身份验证,但我宁愿在我的应用程序中避免这样做。
谢谢!
从 Cloud Functions 的角度来看,这种方法很好。您已将 API 密钥作为环境变量放入配置中。将密钥放入Google Secret Manager会更安全,但你这里的做法是合理的。
除了......问题是如何填充环境变量的配置以及如何存储该信息的“源”。
例如,如果您将 API 密钥放入某种类型的 shell 脚本中,并通过
firebase functions:config:set ....
传递该 API 密钥,那么 shell 脚本中的数据就会存在风险。您需要保护该文件。例如,将其作为明文存储在版本控制系统中将是一种不安全的方法。