Skip to content

Commit

Permalink
feat(providers): add Trakt provider (#3771)
Browse files Browse the repository at this point in the history
* added trakt provider

* fixed incorrect auth url

* Update src/providers/trakt.ts

Co-authored-by: Balázs Orbán <info@balazsorban.com>

* Update src/providers/trakt.ts

Co-authored-by: Balázs Orbán <info@balazsorban.com>

* Update trakt.ts

Co-authored-by: caidenwilson <caidenwilson@protonmail.com>
Co-authored-by: Balázs Orbán <info@balazsorban.com>
  • Loading branch information
3 people committed Feb 3, 2022
1 parent c9e16fb commit 844c9b1
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 0 deletions.
3 changes: 3 additions & 0 deletions app/.env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ TWITTER_SECRET=
LINE_ID=
LINE_SECRET=

TRAKT_ID=
TRAKT_SECRET=

# Example configuration for a Gmail account (will need SMTP enabled)
EMAIL_SERVER=smtps://user@gmail.com:password@smtp.gmail.com:465
EMAIL_FROM=user@gmail.com
Expand Down
5 changes: 5 additions & 0 deletions app/pages/api/auth/[...nextauth].ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import AzureB2C from "next-auth/providers/azure-ad-b2c"
import OsuProvider from "next-auth/providers/osu"
import AppleProvider from "next-auth/providers/apple"
import PatreonProvider from "next-auth/providers/patreon"
import TraktProvider from "next-auth/providers/trakt"

// import { PrismaAdapter } from "@next-auth/prisma-adapter"
// import { PrismaClient } from "@prisma/client"
Expand Down Expand Up @@ -190,6 +191,10 @@ export const authOptions: NextAuthOptions = {
clientId: process.env.PATREON_ID,
clientSecret: process.env.PATREON_SECRET,
}),
TraktProvider({
clientId: process.env.TRAKT_ID,
clientSecret: process.env.TRAKT_SECRET,
}),
],
debug: true,
theme: {
Expand Down
56 changes: 56 additions & 0 deletions src/providers/trakt.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import type { OAuthConfig, OAuthUserConfig } from "."

export interface TraktUser {
username: string
private: boolean
name: string
vip: boolean
vip_ep: boolean
ids: { slug: string }
joined_at: string
location: string | null
about: string | null
gender: string | null
age: number | null
images: { avatar: { full: string } }
}

export default function Trakt<
P extends Record<string, any> = TraktUser
>(options: OAuthUserConfig<P>): OAuthConfig<P> {
return {
id: "trakt",
name: "Trakt",
type: "oauth",
authorization: {
url: "https://trakt.tv/oauth/authorize",
params: { scope: "" }, // when default, trakt returns auth error
},
token: "https://api.trakt.tv/oauth/token",

userinfo: {
async request(context) {
const res = await fetch("https://api.trakt.tv/users/me?extended=full", {
headers: {
Authorization: `Bearer ${context.tokens.access_token}`,
"trakt-api-version": "2",
"trakt-api-key": context.provider.clientId as string,
},
})

if (res.ok) return await res.json()

throw new Error("Expected 200 OK from the userinfo endpoint")
},
},
profile(profile) {
return {
id: profile.ids.slug,
name: profile.name,
email: null, // trakt does not provide user emails
image: profile.images.avatar.full, // trakt does not allow hotlinking
}
},
options,
}
}

0 comments on commit 844c9b1

Please sign in to comment.