feat: implement multi-tenancy in TokenManager
This commit is contained in:
+13
-17
@@ -7,41 +7,37 @@ export class TokenManager {
|
||||
private provider: OAuthProvider,
|
||||
) {}
|
||||
|
||||
async getAccessToken(providerName: string): Promise<string | null> {
|
||||
const accessKey = `provider:${providerName}:access_token`;
|
||||
async getAccessToken(tenantId: string, providerName: string): Promise<string | null> {
|
||||
const accessKey = `tenant:${tenantId}:provider:${providerName}:access_token`;
|
||||
const cached = await this.redis.get(accessKey);
|
||||
if (cached) return cached;
|
||||
|
||||
const refreshKey = `provider:${providerName}:refresh_token`;
|
||||
const refreshKey = `tenant:${tenantId}:provider:${providerName}:refresh_token`;
|
||||
const refreshToken = await this.redis.get(refreshKey);
|
||||
if (!refreshToken) return null;
|
||||
|
||||
const tokens = await this.provider.refreshToken(refreshToken);
|
||||
await this.saveTokens(providerName, tokens);
|
||||
await this.saveTokens(tenantId, providerName, tokens);
|
||||
return tokens.accessToken;
|
||||
}
|
||||
|
||||
async refreshAccessToken(providerName: string): Promise<string | null> {
|
||||
const refreshKey = `provider:${providerName}:refresh_token`;
|
||||
async refreshAccessToken(tenantId: string, providerName: string): Promise<string | null> {
|
||||
const refreshKey = `tenant:${tenantId}:provider:${providerName}:refresh_token`;
|
||||
const refreshToken = await this.redis.get(refreshKey);
|
||||
if (!refreshToken) return null;
|
||||
|
||||
const tokens = await this.provider.refreshToken(refreshToken);
|
||||
await this.saveTokens(providerName, tokens);
|
||||
await this.saveTokens(tenantId, providerName, tokens);
|
||||
return tokens.accessToken;
|
||||
}
|
||||
|
||||
async saveTokens(providerName: string, tokens: TokenResponse) {
|
||||
async saveTokens(tenantId: string, providerName: string, tokens: TokenResponse) {
|
||||
const baseKey = `tenant:${tenantId}:provider:${providerName}`;
|
||||
await this.redis.set(`${baseKey}:access_token`, tokens.accessToken, "EX", tokens.expiresIn);
|
||||
await this.redis.set(`${baseKey}:refresh_token`, tokens.refreshToken);
|
||||
await this.redis.set(`${baseKey}:last_updated`, new Date().toISOString());
|
||||
await this.redis.set(
|
||||
`provider:${providerName}:access_token`,
|
||||
tokens.accessToken,
|
||||
"EX",
|
||||
tokens.expiresIn,
|
||||
);
|
||||
await this.redis.set(`provider:${providerName}:refresh_token`, tokens.refreshToken);
|
||||
await this.redis.set(`provider:${providerName}:last_updated`, new Date().toISOString());
|
||||
await this.redis.set(
|
||||
`provider:${providerName}:expires_at`,
|
||||
`${baseKey}:expires_at`,
|
||||
new Date(Date.now() + tokens.expiresIn * 1000).toISOString(),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user