mirror of
				https://github.com/Dan6erbond/sk-auth.git
				synced 2025-10-26 10:22:56 +01:00 
			
		
		
		
	✨ add github provider (#50)
This commit is contained in:
		
							parent
							
								
									731eabd893
								
							
						
					
					
						commit
						7c3d02ea0a
					
				
							
								
								
									
										50
									
								
								src/providers/github.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/providers/github.ts
									
									
									
									
									
										Normal file
									
								
							@ -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<GitHubProfile, GitHubTokens>;
 | 
			
		||||
 | 
			
		||||
const defaultConfig: Partial<GitHubOAuth2ProviderConfig> = {
 | 
			
		||||
  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<GitHubProfile> {
 | 
			
		||||
    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();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -11,3 +11,5 @@ export type { ProfileCallback } from "./oauth2.base";
 | 
			
		||||
export { OAuth2Provider } from "./oauth2";
 | 
			
		||||
export { RedditOAuth2Provider } from "./reddit";
 | 
			
		||||
export type { RedditProfile, RedditTokens } from "./reddit";
 | 
			
		||||
export { GitHubOAuth2Provider } from "./github";
 | 
			
		||||
export type { GitHubProfile, GitHubTokens } from "./github";
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user