mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 00:40:14 +01:00
🛂 refactor(openidStrategy): Use Strategy Functions for Avatars (#2467)
This commit is contained in:
parent
f406a85633
commit
de3987cbaf
1 changed files with 35 additions and 31 deletions
|
|
@ -1,9 +1,7 @@
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
const axios = require('axios');
|
|
||||||
const passport = require('passport');
|
const passport = require('passport');
|
||||||
const jwtDecode = require('jsonwebtoken/decode');
|
const jwtDecode = require('jsonwebtoken/decode');
|
||||||
const { Issuer, Strategy: OpenIDStrategy } = require('openid-client');
|
const { Issuer, Strategy: OpenIDStrategy } = require('openid-client');
|
||||||
|
const { getStrategyFunctions } = require('~/server/services/Files/strategies');
|
||||||
const { logger } = require('~/config');
|
const { logger } = require('~/config');
|
||||||
const User = require('~/models/User');
|
const User = require('~/models/User');
|
||||||
|
|
||||||
|
|
@ -13,22 +11,31 @@ try {
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[openidStrategy] crypto support is disabled!', err);
|
logger.error('[openidStrategy] crypto support is disabled!', err);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Downloads an image from a URL using an access token.
|
||||||
|
* @param {string} url
|
||||||
|
* @param {string} accessToken
|
||||||
|
* @returns {Promise<Buffer>}
|
||||||
|
*/
|
||||||
|
const downloadImage = async (url, accessToken) => {
|
||||||
|
if (!url) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
const downloadImage = async (url, imagePath, accessToken) => {
|
|
||||||
try {
|
try {
|
||||||
const response = await axios.get(url, {
|
const response = await fetch(url, {
|
||||||
|
method: 'GET',
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: `Bearer ${accessToken}`,
|
Authorization: `Bearer ${accessToken}`,
|
||||||
},
|
},
|
||||||
responseType: 'arraybuffer',
|
|
||||||
});
|
});
|
||||||
|
|
||||||
fs.mkdirSync(path.dirname(imagePath), { recursive: true });
|
if (response.ok) {
|
||||||
fs.writeFileSync(imagePath, response.data);
|
const buffer = await response.buffer();
|
||||||
|
return buffer;
|
||||||
const fileName = path.basename(imagePath);
|
} else {
|
||||||
|
throw new Error(`${response.statusText} (HTTP ${response.status})`);
|
||||||
return `/images/openid/${fileName}`;
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error(
|
logger.error(
|
||||||
`[openidStrategy] downloadImage: Error downloading image at URL "${url}": ${error}`,
|
`[openidStrategy] downloadImage: Error downloading image at URL "${url}": ${error}`,
|
||||||
|
|
@ -124,7 +131,9 @@ async function setupOpenId() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const username = convertToUsername(userinfo.username || userinfo.given_name || userinfo.email);
|
const username = convertToUsername(
|
||||||
|
userinfo.username || userinfo.given_name || userinfo.email,
|
||||||
|
);
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
user = new User({
|
user = new User({
|
||||||
|
|
@ -143,6 +152,7 @@ async function setupOpenId() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userinfo.picture) {
|
if (userinfo.picture) {
|
||||||
|
/** @type {string | undefined} */
|
||||||
const imageUrl = userinfo.picture;
|
const imageUrl = userinfo.picture;
|
||||||
|
|
||||||
let fileName;
|
let fileName;
|
||||||
|
|
@ -154,24 +164,18 @@ async function setupOpenId() {
|
||||||
fileName = userinfo.sub + '.png';
|
fileName = userinfo.sub + '.png';
|
||||||
}
|
}
|
||||||
|
|
||||||
const imagePath = path.join(
|
const imageBuffer = await downloadImage(imageUrl, tokenset.access_token);
|
||||||
__dirname,
|
const { saveBuffer } = getStrategyFunctions(process.env.CDN_PROVIDER);
|
||||||
'..',
|
if (imageBuffer) {
|
||||||
'..',
|
const imagePath = await saveBuffer({
|
||||||
'client',
|
fileName,
|
||||||
'public',
|
userId: user._id.toString(),
|
||||||
'images',
|
buffer: imageBuffer,
|
||||||
'openid',
|
});
|
||||||
fileName,
|
user.avatar = imagePath ?? '';
|
||||||
);
|
} else {
|
||||||
|
user.avatar = '';
|
||||||
const imagePathOrEmpty = await downloadImage(
|
}
|
||||||
imageUrl,
|
|
||||||
imagePath,
|
|
||||||
tokenset.access_token,
|
|
||||||
);
|
|
||||||
|
|
||||||
user.avatar = imagePathOrEmpty;
|
|
||||||
} else {
|
} else {
|
||||||
user.avatar = '';
|
user.avatar = '';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue