You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/server/plugins/com.msgbyte.iam/strategies/github.ts

73 lines
2.0 KiB
TypeScript

import { config } from 'tailchat-server-sdk';
import type { StrategyType } from './types';
import got from 'got';
const clientInfo = {
id: process.env.IAM_GITHUB_ID,
secret: process.env.IAM_GITHUB_SECRET,
};
const authorize_uri =
process.env.IAM_GITHUB_URI_AUTHORIZE ||
'https://github.com/login/oauth/authorize';
const access_token_uri =
process.env.IAM_GITHUB_URI_ACCESS_TOKEN ||
'https://github.com/login/oauth/access_token';
const userinfo_uri =
process.env.IAM_GITHUB_URI_USERINFO || 'https://api.github.com/user';
const redirect_uri = `${config.apiUrl}/api/plugin:com.msgbyte.iam/github/redirect`;
export const GithubStrategy: StrategyType = {
name: 'github',
type: 'oauth',
icon: '/images/avatar/github-dark.svg',
checkAvailable: () => !!clientInfo.id && !!clientInfo.secret,
getUrl: () => {
return `${authorize_uri}?client_id=${clientInfo.id}&redirect_uri=${redirect_uri}`;
},
getUserInfo: async (code) => {
console.log('[github oauth] authorization code:', code);
const tokenResponse = await got
.post(access_token_uri, {
searchParams: {
client_id: clientInfo.id,
client_secret: clientInfo.secret,
code: code,
},
headers: {
accept: 'application/json',
},
})
.json<{ access_token: string }>();
const accessToken = tokenResponse.access_token;
console.log(`[github oauth] access token: ${accessToken}`);
const result = await got
.get(userinfo_uri, {
headers: {
accept: 'application/json',
Authorization: `token ${accessToken}`,
},
})
.json<{
id: number;
login: string;
name: string;
email: string;
avatar_url: string;
}>();
console.log(`[github oauth] user info:`, result);
return {
id: String(result.id),
nickname: result.name ?? result.login,
username: result.login,
email: result.email,
avatar: result.avatar_url,
};
},
};