From cdf467eba1be64738797958588ee513d001ea6cc Mon Sep 17 00:00:00 2001 From: Aliaksei Tayanouski Date: Wed, 13 Jul 2022 15:04:55 +0300 Subject: [PATCH] fix(providers): fix VK provider and convert to TS (#3709) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * renamed vk provider file extension to .ts * lint issue fix * vk provider fix * formatting fix * remove user_id from tokens * Update src/providers/vk.ts Co-authored-by: Balázs Orbán * Update src/providers/vk.ts Co-authored-by: Balázs Orbán * user interface additions Co-authored-by: Balázs Orbán --- apps/dev/pages/api/auth/[...nextauth].ts | 7 +- packages/next-auth/src/providers/vk.js | 23 -- packages/next-auth/src/providers/vk.ts | 285 +++++++++++++++++++++++ 3 files changed, 291 insertions(+), 24 deletions(-) delete mode 100644 packages/next-auth/src/providers/vk.js create mode 100644 packages/next-auth/src/providers/vk.ts diff --git a/apps/dev/pages/api/auth/[...nextauth].ts b/apps/dev/pages/api/auth/[...nextauth].ts index 2f3bde3e70..2d9033ba58 100644 --- a/apps/dev/pages/api/auth/[...nextauth].ts +++ b/apps/dev/pages/api/auth/[...nextauth].ts @@ -4,7 +4,7 @@ import GitHubProvider from "next-auth/providers/github" import Auth0Provider from "next-auth/providers/auth0" import KeycloakProvider from "next-auth/providers/keycloak" import TwitterProvider, { - TwitterLegacy as TwitterLegacyProvider, + // TwitterLegacy as TwitterLegacyProvider, } from "next-auth/providers/twitter" import CredentialsProvider from "next-auth/providers/credentials" import IDS4Provider from "next-auth/providers/identity-server4" @@ -33,6 +33,7 @@ import TraktProvider from "next-auth/providers/trakt" import WorkOSProvider from "next-auth/providers/workos" import BoxyHQSAMLProvider from "next-auth/providers/boxyhq-saml" import WikimediaProvider from "next-auth/providers/wikimedia" +import VkProvider from "next-auth/providers/vk" // TypeORM // import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" @@ -234,6 +235,10 @@ export const authOptions: NextAuthOptions = { clientId: process.env.WIKIMEDIA_ID, clientSecret: process.env.WIKIMEDIA_SECRET, }), + VkProvider({ + clientId: process.env.VK_ID, + clientSecret: process.env.VK_SECRET + }), ], debug: true, theme: { diff --git a/packages/next-auth/src/providers/vk.js b/packages/next-auth/src/providers/vk.js deleted file mode 100644 index 8530e1e4b8..0000000000 --- a/packages/next-auth/src/providers/vk.js +++ /dev/null @@ -1,23 +0,0 @@ -/** @type {import(".").OAuthProvider} */ -export default function VK(options) { - const apiVersion = "5.126" // https://vk.com/dev/versions - - return { - id: "vk", - name: "VK", - type: "oauth", - authorization: `https://oauth.vk.com/authorize?scope=email&v=${apiVersion}`, - token: `https://oauth.vk.com/access_token?v=${apiVersion}`, - userinfo: `https://api.vk.com/method/users.get?fields=photo_100&v=${apiVersion}`, - profile(result) { - const profile = result.response?.[0] ?? {} - return { - id: profile.id, - name: [profile.first_name, profile.last_name].filter(Boolean).join(" "), - email: profile.email, - image: profile.photo_100, - } - }, - options, - } -} diff --git a/packages/next-auth/src/providers/vk.ts b/packages/next-auth/src/providers/vk.ts new file mode 100644 index 0000000000..6f8cdc740e --- /dev/null +++ b/packages/next-auth/src/providers/vk.ts @@ -0,0 +1,285 @@ +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 = VkProfile +>(options: OAuthUserConfig

): OAuthConfig

{ + 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, + } + }, + options, + } +}