mirror of https://github.com/msgbyte/tailchat
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.
73 lines
2.0 KiB
TypeScript
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,
|
|
};
|
|
},
|
|
};
|