diff --git a/src/providers/github.ts b/src/providers/github.ts new file mode 100644 index 0000000..274d64c --- /dev/null +++ b/src/providers/github.ts @@ -0,0 +1,50 @@ +import { OAuth2Provider, OAuth2ProviderConfig } from "./oauth2"; + +export interface GitHubProfile { + id: number; + login: string; + avatar_url: string; + url: string; + name: string; + // complete with more info +} + +export interface GitHubTokens { + access_token: string; + token_type: string; + expires_in: number; +} + +type GitHubOAuth2ProviderConfig = OAuth2ProviderConfig; + +const defaultConfig: Partial = { + id: "github", + scope: "user", + accessTokenUrl: "https://github.com/login/oauth/access_token", + authorizationUrl: "https://github.com/login/oauth/authorize", + profileUrl: "https://api.github.com/user", + headers: { + Accept: "application/json", + }, +}; + +export class GitHubOAuth2Provider extends OAuth2Provider< + GitHubProfile, + GitHubTokens, + GitHubOAuth2ProviderConfig +> { + constructor(config: GitHubOAuth2ProviderConfig) { + super({ + ...defaultConfig, + ...config, + }); + } + + async getUserProfile(tokens: GitHubTokens): Promise { + const tokenType = "token"; // 🤷‍♂️ token type returned is "bearer" but GitHub uses "token" keyword + const res = await fetch(this.config.profileUrl!, { + headers: { Authorization: `${tokenType} ${tokens.access_token}` }, + }); + return await res.json(); + } +} diff --git a/src/providers/index.ts b/src/providers/index.ts index 79e59f8..b33a5fc 100644 --- a/src/providers/index.ts +++ b/src/providers/index.ts @@ -1,9 +1,8 @@ export { Provider } from "./base"; -export { TwitchOAuth2Provider } from "./twitch"; -export type { TwitchProfile, TwitchTokens } from "./twitch"; +export { GitHubOAuth2Provider } from "./github"; +export type { GitHubProfile, GitHubTokens } from "./github"; export { GoogleOAuth2Provider } from "./google"; export type { GoogleProfile, GoogleTokens } from "./google"; -export { TwitterAuthProvider } from "./twitter"; export { FacebookOAuth2Provider } from "./facebook"; export type { FacebookProfile, FacebookTokens } from "./facebook"; export { OAuth2BaseProvider } from "./oauth2.base"; @@ -13,3 +12,6 @@ export { RedditOAuth2Provider } from "./reddit"; export type { RedditProfile, RedditTokens } from "./reddit"; export { SpotifyOAuth2Provider } from "./spotify"; export type { SpotifyProfile, SpotifyTokens } from "./spotify"; +export { TwitchOAuth2Provider } from "./twitch"; +export type { TwitchProfile, TwitchTokens } from "./twitch"; +export { TwitterAuthProvider } from "./twitter";