UNPKG

next-auth

Version:

Authentication for Next.js

312 lines (308 loc) 7.18 kB
import type { OAuthConfig, OAuthUserConfig } from "." export interface VkProfile { // https://dev.vk.com/reference/objects/user response: Array<{ id: number first_name: string last_name: string photo_100: string can_access_closed: boolean is_closed: boolean deactivated?: string sex?: 0 | 1 | 2 screen_name?: string photo_50?: string online?: 0 | 1 online_mobile?: 0 | 1 online_app?: number verified?: 0 | 1 trending?: 0 | 1 friend_status?: 0 | 1 | 2 | 3 first_name_nom?: string first_name_gen?: string first_name_dat?: string first_name_acc?: string first_name_ins?: string first_name_abl?: string last_name_nom?: string last_name_gen?: string last_name_dat?: string last_name_acc?: string last_name_ins?: string last_name_abl?: string nickname?: string maiden_name?: string domain?: string bdate?: string city?: { id: number title: string } country?: { id: number title: string } timezone?: number photo_200?: string photo_max?: string photo_200_orig?: string photo_400_orig?: string photo_max_orig?: string photo_id?: string has_photo?: 0 | 1 has_mobile?: 0 | 1 is_friend?: 0 | 1 can_post?: 0 | 1 can_see_all_posts?: 0 | 1 can_see_audio?: 0 | 1 connections?: { facebook?: string skype?: string twitter?: string livejournal?: string instagram?: string } photo_400?: string wall_default?: "owner" | "all" interests?: string books?: string tv?: string quotes?: string about?: string games?: string movies?: string activities?: string music?: string can_write_private_message?: 0 | 1 can_send_friend_request?: 0 | 1 contacts?: { mobile_phone?: string home_phone?: string } site?: string status_audio?: { access_key?: string artist: string id: number owner_id: number title: string url?: string duration: number date?: number album_id?: number genre_id?: number performer?: string } status?: string last_seen?: { platform?: 1 | 2 | 3 | 4 | 5 | 6 | 7 time?: number } exports?: { facebook?: number livejournal?: number twitter?: number instagram?: number } crop_photo?: { photo: { access_key?: string album_id: number date: number height?: number id: number images?: Array<{ height?: number type?: "s" | "m" | "x" | "l" | "o" | "p" | "q" | "r" | "y" | "z" | "w" url?: string width?: number }> lat?: number long?: number owner_id: number photo_256?: string can_comment?: 0 | 1 place?: string post_id?: number sizes?: Array<{ height: number url: string src?: string type: | "s" | "m" | "x" | "o" | "p" | "q" | "r" | "k" | "l" | "y" | "z" | "c" | "w" | "a" | "b" | "e" | "i" | "d" | "j" | "temp" | "h" | "g" | "n" | "f" | "max" width: number }> text?: string user_id?: number width?: number has_tags: boolean } crop: { x: number y: number x2: number y2: number } rect: { x: number y: number x2: number y2: number } } followers_count?: number blacklisted?: 0 | 1 blacklisted_by_me?: 0 | 1 is_favorite?: 0 | 1 is_hidden_from_feed?: 0 | 1 common_count?: number occupation?: { id?: number name?: string type?: "work" | "school" | "university" } career?: { group_id?: number company?: string country_id?: number city_id?: number city_name?: string from?: number until?: number position?: string } military?: { country_id: number from?: number unit: string unit_id: number until?: number } education?: { university?: number university_name?: string faculty?: number faculty_name?: string graduation?: number } home_town?: string relation?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 relation_partner?: { deactivated?: string first_name: string hidden?: number id: number last_name: string can_access_closed?: boolean is_closed?: boolean } personal?: { alcohol?: 1 | 2 | 3 | 4 | 5 inspired_by?: string langs?: string[] life_main?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 people_main?: 1 | 2 | 3 | 4 | 5 | 6 political?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 religion?: string smoking?: 1 | 2 | 3 | 4 | 5 } universities?: Array<{ chair?: number chair_name?: string city?: number country?: number education_form?: string education_status?: string faculty?: number faculty_name?: string graduation?: number id?: number name?: string university_group_id?: number }> schools?: Array<{ city?: number class?: string country?: number id?: string name?: string type?: number type_str?: string year_from?: number year_graduated?: number year_to?: number speciality?: string }> relatives?: Array<{ id?: number name?: string type: "parent" | "child" | "grandparent" | "grandchild" | "sibling" }> counters?: { albums?: number videos?: number audios?: number photos?: number notes?: number friends?: number groups?: number online_friends?: number mutual_friends?: number user_videos?: number followers?: number pages?: number } is_no_index?: 0 | 1 }> } export default function VK<P extends Record<string, any> = VkProfile>( options: OAuthUserConfig<P> ): OAuthConfig<P> { const apiVersion = "5.131" // https://vk.com/dev/versions return { id: "vk", name: "VK", type: "oauth", authorization: `https://oauth.vk.com/authorize?scope=email&v=${apiVersion}`, client: { token_endpoint_auth_method: "client_secret_post", }, token: `https://oauth.vk.com/access_token?v=${apiVersion}`, userinfo: `https://api.vk.com/method/users.get?fields=photo_100&v=${apiVersion}`, profile(result: P) { const profile = result.response?.[0] ?? {} return { id: profile.id, name: [profile.first_name, profile.last_name].filter(Boolean).join(" "), email: null, image: profile.photo_100, } }, style: { logo: "/vk.svg", bg: "#07F", text: "#fff" }, options, } }