{"id":70280,"date":"2024-07-22T00:03:56","date_gmt":"2024-07-21T20:33:56","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/roles-based-authentication-using-nextauth-and-nextjs-51h1\/"},"modified":"2024-07-22T00:03:56","modified_gmt":"2024-07-21T20:33:56","slug":"roles-based-authentication-using-nextauth-and-nextjs-51h1","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/roles-based-authentication-using-nextauth-and-nextjs-51h1\/","title":{"rendered":"\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0646\u0642\u0634 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nextauth \u0648 next.js"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            \u0633\u0644\u0627\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06af\u0631 \u0634\u0645\u0627 \u0647\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u062a\u062d\u062f \u062a\u0627\u0631\u06cc\u06a9 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062c\u0633\u062a\u062c\u0648\u06cc \u0631\u0627\u0647\u200c\u062d\u0644\u200c\u0647\u0627\u06cc Auth \u0648 \u0646\u0642\u0634\u200c\u0647\u0627\u06cc \u062e\u0648\u062f\u062a\u0627\u0646 \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0631\u062f\u06cc\u062f\u060c \u0627\u0645\u0627 \u0646\u062a\u0648\u0627\u0646\u0633\u062a\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0634\u0627\u06cc\u062f \u0647\u0645 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u06cc\u062f\u060c \u062f\u06cc\u06af\u0631 \u06a9\u0627\u0631 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u067e\u0633 \u062f\u0631 \u0645\u06a9\u0627\u0646 \u0645\u0646\u0627\u0633\u0628\u06cc \u0628\u0627 \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0633\u062a\u06cc\u062f. \u06a9\u062f \u0645\u0646 \u0646\u0633\u062e\u0647 \u0628\u0633\u062a\u0647 \u0647\u0627 \u0631\u0627 \u0646\u06cc\u0632 \u0645\u06cc \u062f\u0647\u0645 \u062a\u0627 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u0631\u0627\u062d\u062a \u062a\u0631 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0627\u0628\u062a\u062f\u0627 \u062a\u0645\u0627\u0645 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u062e\u0648\u062f \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u0645<\/p>\n<p>  npm install next-auth@beta<br \/>\n  npm install drizzle-orm zod react-hook-form<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 auth \u0631\u0627 \u0628\u0631\u0627\u06cc nextAuth \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062f\u0631 \u0645\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f <\/p>\n<p>lib\/auth\/index.ts<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0645\u0627 \u0627\u0632 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 credentails \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0632\u06cc\u0631\u0627 \u0628\u0647\u200c\u0637\u0648\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 OAuth \u0647\u06cc\u0686 \u0646\u0642\u0634\u06cc \u0631\u0627 \u0628\u0647 \u0645\u0627 \u0628\u0627\u0632 \u0646\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f\u060c \u0627\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 oAuth \u0628\u0631\u0627\u06cc \u0627\u062e\u062a\u0635\u0627\u0635 \u0646\u0642\u0634\u200c\u0647\u0627 \u0631\u0627 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u06cc\u062f.<\/p>\n<p>  export const { handlers, signIn, signOut, auth } = NextAuth({<br \/>\n adapter: DrizzleAdapter(db),<br \/>\n  providers: [<br \/>\n    Credentials({<br \/>\n      name: &#8220;credentials&#8221;,<br \/>\n      credentials: {<br \/>\n        email: {<br \/>\n          type: &#8220;email&#8221;,<br \/>\n          label: &#8220;Email Address&#8221;,<br \/>\n          placeholder: &#8220;Email Address&#8221;,<br \/>\n        },<br \/>\n        password: {<br \/>\n          type: &#8220;password&#8221;,<br \/>\n          label: &#8220;Password&#8221;,<br \/>\n        },<br \/>\n      },<br \/>\n      async authorize(credentials) {<br \/>\n        const { email, password } = await signInSchema.parseAsync(credentials);<\/p>\n<p>        const user = await db<br \/>\n          .select()<br \/>\n          .from(users)<br \/>\n          .where(eq(users.email, email))<br \/>\n          .execute()<br \/>\n          .then((res) =&gt; res[0]);<\/p>\n<p>        if (!user || !user.password) return null;<\/p>\n<p>         const isValidPassword = await bcryptjs.compare(password, user.password);<\/p>\n<p>         if (!isValidPassword) return null;<\/p>\n<p>        return {<br \/>\n          id: user.id,<br \/>\n          name: user.name,<br \/>\n          email: user.email,<br \/>\n        };<br \/>\n      },<br \/>\n    }),<br \/>\n    GoogleProvider({<br \/>\n      clientId: process.env.GOOGLE_CLIENT_ID,<br \/>\n      clientSecret: process.env.GOOGLE_CLIENT_SECRET,<\/p>\n<p>      profile(profile: GoogleProfile) {<br \/>\n        return { &#8230;profile, role: &#8220;user&#8221; };<br \/>\n      },<br \/>\n    })<br \/>\n  ],<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0634\u0627\u06cc\u062f \u0632\u0645\u0627\u0646 \u062e\u0648\u0628\u06cc \u0628\u0627\u0634\u062f \u06a9\u0647 \u0628\u06af\u0648\u06cc\u06cc\u0645 \u0645\u0646 \u0627\u0632 postgres \u0648 drizzle ORM \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0632 DB \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<p>\u0645\u0627 \u0627\u0632 \u0622\u062f\u0627\u067e\u062a\u0648\u0631 drizzle \u0628\u0631\u0627\u06cc \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/p>\n<p>npm install drizzle-orm @auth\/drizzle-adapter<br \/>\nnpm install drizzle-kit &#8211;save-dev<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0637\u0631\u062d \u0645\u0646\u0627\u0633\u0628 \u0628\u0627\u0631\u0627\u0646\u06cc \u0631\u0627 \u062f\u0631 \u0644\u06cc\u0646\u06a9 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u062c\u0648\u0632 \u06a9\u0627\u0631 \u06a9\u0646\u062f.  \u0627\u06a9\u0646\u0648\u0646 \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0647\u0646\u062f\u0644\u0631 \u062f\u0631 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc api \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<p>import { handlers } from &#8220;@\/lib\/auth&#8221;;<\/p>\n<p>export const { GET, POST } = handlers;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 auth \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f \u0627\u0645\u0627 \u0647\u0646\u0648\u0632 \u0646\u0642\u0634\u06cc \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.  \u0627\u0628\u062a\u062f\u0627 \u0637\u0631\u062d drizzle \u0648 \u0633\u067e\u0633 \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc nextAuth \u062e\u0648\u062f \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc \u062f\u0647\u06cc\u0645.<\/p>\n<p>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0641\u06cc\u0644\u062f \u0633\u0627\u062f\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0646\u0642\u0634 \u062f\u0631 \u062c\u062f\u0648\u0644 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0628\u0627\u0634\u062f \u06a9\u0647 \u062f\u0627\u0631\u0627\u06cc \u06cc\u06a9 \u0645\u0642\u062f\u0627\u0631 \u0631\u0634\u062a\u0647 \u0627\u0633\u062a.  \u0627\u0645\u0627 \u0645\u0646 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644 \u0633\u0627\u062e\u062a\u0645 \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u0645 \u0647\u0631 \u062a\u0639\u062f\u0627\u062f \u0646\u0642\u0634\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u0628\u0633\u0627\u0632\u0645 \u0648 \u0628\u0647 \u0622\u0646 \u0645\u062c\u0648\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645<\/p>\n<p>export const roles = pgTable(&#8220;roles&#8221;, {<br \/>\n  id: text(&#8220;id&#8221;)<br \/>\n    .primaryKey()<br \/>\n    .$defaultFn(() =&gt; createId()),<br \/>\n  name: text(&#8220;name&#8221;).notNull(),<br \/>\n  description: text(&#8220;description&#8221;),<br \/>\n});<\/p>\n<p>export const permissions = pgTable(&#8220;permissions&#8221;, {<br \/>\n  id: text(&#8220;id&#8221;)<br \/>\n    .primaryKey()<br \/>\n    .$defaultFn(() =&gt; createId()),<br \/>\n  name: text(&#8220;name&#8221;).notNull(),<br \/>\n  description: text(&#8220;description&#8221;),<br \/>\n});<\/p>\n<p>export const rolePermissions = pgTable(&#8220;role_permissions&#8221;, {<br \/>\n  roleId: text(&#8220;roleId&#8221;).references(() =&gt; roles.id, { onDelete: &#8220;cascade&#8221; }),<br \/>\n  permissionId: text(&#8220;permissionId&#8221;).references(() =&gt; permissions.id, {<br \/>\n    onDelete: &#8220;cascade&#8221;,<br \/>\n  }),<br \/>\n});<\/p>\n<p>export const userRoles = pgTable(&#8220;user_roles&#8221;, {<br \/>\n  userId: text(&#8220;userId&#8221;).references(() =&gt; users.id, { onDelete: &#8220;cascade&#8221; }),<br \/>\n  roleId: text(&#8220;roleId&#8221;).references(() =&gt; roles.id, { onDelete: &#8220;cascade&#8221; }),<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f NextAuthOption \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u0645 \u062a\u0627 \u0646\u0642\u0634\u200c\u0647\u0627 \u0648 \u0645\u062c\u0648\u0632\u0647\u0627 \u062f\u0631 \u062c\u0644\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 \u06af\u0646\u062c\u0627\u0646\u062f\u0647 \u0634\u0648\u0646\u062f.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u062a\u0648\u0627\u0628\u0639 \u067e\u0627\u0633\u062e \u0628\u0647 \u062a\u0645\u0627\u0633 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0646\u0642\u0634 \u0647\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p> callbacks: {<br \/>\n    async jwt({ token, user }) {<br \/>\n      if (user &amp;&amp; user.id) {<br \/>\n        const { role, permissions } = await getUserRoleAndPermissions(user.id);<br \/>\n        token.role = role;<br \/>\n        token.permissions = permissions;<br \/>\n      }<br \/>\n      return token;<br \/>\n    },<br \/>\n    async session({ session, token }) {<br \/>\n      if (token &amp;&amp; session.user) {<br \/>\n        session.user.id = token.id;<br \/>\n        session.user.role = token.role;<br \/>\n        session.user.permissions = token.permissions;<br \/>\n      }<br \/>\n      return session;<br \/>\n    },<br \/>\n  },<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062a\u0627\u0628\u0639 getRolesandPermission \u062f\u0642\u06cc\u0642\u0627\u064b \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u0627\u0632 drizzle \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u0642\u0634 \u0647\u0627 \u0648 \u0645\u062c\u0648\u0632 \u0627\u0632 db \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0647\u200c\u0637\u0648\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0627\u06cc\u0646 \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u06a9\u0627\u0631 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627\u06cc\u062f \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a\u06cc \u062f\u0631 \u0627\u0646\u0648\u0627\u0639 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645.<\/p>\n<p>declare module &#8220;next-auth&#8221; {<br \/>\n  interface Session {<br \/>\n    user: {<br \/>\n      id: string;<br \/>\n      role: string;<br \/>\n      permissions: string[];<br \/>\n    } &amp; DefaultSession[&#8220;user&#8221;];<br \/>\n  }<br \/>\n}<\/p>\n<p>declare module &#8220;next-auth\/jwt&#8221; {<br \/>\n  interface JWT {<br \/>\n    id: string;<br \/>\n    role: string;<br \/>\n    permissions: string[];<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u062c\u0644\u0633\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0646\u0642\u0634 \u0647\u0627 \u0648 \u0645\u062c\u0648\u0632\u0647\u0627 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u0645.  \u0648 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u062f\u0631 \u0633\u0637\u062d \u0635\u0641\u062d\u0647 \u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u06a9\u0644 \u06af\u0631\u0648\u0647 \u0645\u0633\u06cc\u0631\u06cc \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062d\u0627\u0641\u0638\u062a \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0631\u0648\u0634 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u06cc\u06a9 Sass \u0686\u0646\u062f \u0645\u0633\u062a\u0627\u062c\u0631 \u0648\u0627\u0642\u0639\u0627\u064b \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u062f \u0632\u06cc\u0631\u0627 \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0627\u0631\u0628\u0631 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u062c\u0627\u06cc \u062f\u06cc\u06af\u0631\u06cc \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f \u0627\u06cc\u0646 \u06cc\u06a9 \u0631\u0627\u0647 \u062d\u0644 \u0639\u0627\u0644\u06cc \u0627\u0633\u062a.  \u0628\u0631\u0627\u06cc \u0645\u0637\u0627\u0644\u0639\u0647 \u0627\u06cc\u0646 \u0645\u0637\u0644\u0628 \u0627\u0632 \u0634\u0645\u0627 \u0633\u067e\u0627\u0633\u06af\u0632\u0627\u0631\u0645 <\/p>\n<div data-article-id=\"1931077\" id=\"article-body\">\n<p>\u0633\u0644\u0627\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06af\u0631 \u0634\u0645\u0627 \u0647\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u062a\u062d\u062f \u062a\u0627\u0631\u06cc\u06a9 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062c\u0633\u062a\u062c\u0648\u06cc \u0631\u0627\u0647\u200c\u062d\u0644\u200c\u0647\u0627\u06cc Auth \u0648 \u0646\u0642\u0634\u200c\u0647\u0627\u06cc \u062e\u0648\u062f\u062a\u0627\u0646 \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0631\u062f\u06cc\u062f\u060c \u0627\u0645\u0627 \u0646\u062a\u0648\u0627\u0646\u0633\u062a\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0634\u0627\u06cc\u062f \u0647\u0645 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u06cc\u062f\u060c \u062f\u06cc\u06af\u0631 \u06a9\u0627\u0631 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u067e\u0633 \u062f\u0631 \u0645\u06a9\u0627\u0646 \u0645\u0646\u0627\u0633\u0628\u06cc \u0628\u0627 \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0633\u062a\u06cc\u062f. \u06a9\u062f \u0645\u0646 \u0646\u0633\u062e\u0647 \u0628\u0633\u062a\u0647 \u0647\u0627 \u0631\u0627 \u0646\u06cc\u0632 \u0645\u06cc \u062f\u0647\u0645 \u062a\u0627 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u0631\u0627\u062d\u062a \u062a\u0631 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0627\u0628\u062a\u062f\u0627 \u062a\u0645\u0627\u0645 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u062e\u0648\u062f \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u0645<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>  npm <span class=\"nb\">install <\/span>next-auth@beta\n  npm <span class=\"nb\">install <\/span>drizzle-orm zod react-hook-form\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 auth \u0631\u0627 \u0628\u0631\u0627\u06cc nextAuth \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062f\u0631 \u0645\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f <\/p>\n<blockquote>\n<p><strong>lib\/auth\/index.ts<\/strong><\/p>\n<\/blockquote>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0645\u0627 \u0627\u0632 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 credentails \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0632\u06cc\u0631\u0627 \u0628\u0647\u200c\u0637\u0648\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 OAuth \u0647\u06cc\u0686 \u0646\u0642\u0634\u06cc \u0631\u0627 \u0628\u0647 \u0645\u0627 \u0628\u0627\u0632 \u0646\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f\u060c \u0627\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 oAuth \u0628\u0631\u0627\u06cc \u0627\u062e\u062a\u0635\u0627\u0635 \u0646\u0642\u0634\u200c\u0647\u0627 \u0631\u0627 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code>  <span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">handlers<\/span><span class=\"p\">,<\/span> <span class=\"nx\">signIn<\/span><span class=\"p\">,<\/span> <span class=\"nx\">signOut<\/span><span class=\"p\">,<\/span> <span class=\"nx\">auth<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">NextAuth<\/span><span class=\"p\">({<\/span>\n <span class=\"na\">adapter<\/span><span class=\"p\">:<\/span> <span class=\"nc\">DrizzleAdapter<\/span><span class=\"p\">(<\/span><span class=\"nx\">db<\/span><span class=\"p\">),<\/span>\n  <span class=\"na\">providers<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"nc\">Credentials<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">credentials<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">credentials<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">email<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">email<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">label<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Email Address<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">placeholder<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Email Address<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"na\">password<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">password<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">label<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Password<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"k\">async<\/span> <span class=\"nf\">authorize<\/span><span class=\"p\">(<\/span><span class=\"nx\">credentials<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">email<\/span><span class=\"p\">,<\/span> <span class=\"nx\">password<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">signInSchema<\/span><span class=\"p\">.<\/span><span class=\"nf\">parseAsync<\/span><span class=\"p\">(<\/span><span class=\"nx\">credentials<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"kd\">const<\/span> <span class=\"nx\">user<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">db<\/span>\n          <span class=\"p\">.<\/span><span class=\"nf\">select<\/span><span class=\"p\">()<\/span>\n          <span class=\"p\">.<\/span><span class=\"k\">from<\/span><span class=\"p\">(<\/span><span class=\"nx\">users<\/span><span class=\"p\">)<\/span>\n          <span class=\"p\">.<\/span><span class=\"nf\">where<\/span><span class=\"p\">(<\/span><span class=\"nf\">eq<\/span><span class=\"p\">(<\/span><span class=\"nx\">users<\/span><span class=\"p\">.<\/span><span class=\"nx\">email<\/span><span class=\"p\">,<\/span> <span class=\"nx\">email<\/span><span class=\"p\">))<\/span>\n          <span class=\"p\">.<\/span><span class=\"nf\">execute<\/span><span class=\"p\">()<\/span>\n          <span class=\"p\">.<\/span><span class=\"nf\">then<\/span><span class=\"p\">((<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">res<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]);<\/span>\n\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">user<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">password<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n         <span class=\"kd\">const<\/span> <span class=\"nx\">isValidPassword<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">bcryptjs<\/span><span class=\"p\">.<\/span><span class=\"nf\">compare<\/span><span class=\"p\">(<\/span><span class=\"nx\">password<\/span><span class=\"p\">,<\/span> <span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">password<\/span><span class=\"p\">);<\/span>\n\n         <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">isValidPassword<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">email<\/span><span class=\"p\">:<\/span> <span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">email<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">};<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">}),<\/span>\n    <span class=\"nc\">GoogleProvider<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">clientId<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">GOOGLE_CLIENT_ID<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">clientSecret<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">GOOGLE_CLIENT_SECRET<\/span><span class=\"p\">,<\/span>\n\n      <span class=\"nf\">profile<\/span><span class=\"p\">(<\/span><span class=\"na\">profile<\/span><span class=\"p\">:<\/span> <span class=\"nx\">GoogleProfile<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"p\">...<\/span><span class=\"nx\">profile<\/span><span class=\"p\">,<\/span> <span class=\"na\">role<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">user<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">};<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">],<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0634\u0627\u06cc\u062f \u0632\u0645\u0627\u0646 \u062e\u0648\u0628\u06cc \u0628\u0627\u0634\u062f \u06a9\u0647 \u0628\u06af\u0648\u06cc\u06cc\u0645 \u0645\u0646 \u0627\u0632 postgres \u0648 drizzle ORM \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u0632 DB \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<p>\u0645\u0627 \u0627\u0632 \u0622\u062f\u0627\u067e\u062a\u0648\u0631 drizzle \u0628\u0631\u0627\u06cc \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>drizzle-orm @auth\/drizzle-adapter\nnpm <span class=\"nb\">install <\/span>drizzle-kit <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0637\u0631\u062d \u0645\u0646\u0627\u0633\u0628 \u0628\u0627\u0631\u0627\u0646\u06cc \u0631\u0627 \u062f\u0631 \u0644\u06cc\u0646\u06a9 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u062c\u0648\u0632 \u06a9\u0627\u0631 \u06a9\u0646\u062f.  \u0627\u06a9\u0646\u0648\u0646 \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u0647\u0646\u062f\u0644\u0631 \u062f\u0631 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc api \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">handlers<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/lib\/auth<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GET<\/span><span class=\"p\">,<\/span> <span class=\"nx\">POST<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">handlers<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 auth \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f \u0627\u0645\u0627 \u0647\u0646\u0648\u0632 \u0646\u0642\u0634\u06cc \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.  \u0627\u0628\u062a\u062f\u0627 \u0637\u0631\u062d drizzle \u0648 \u0633\u067e\u0633 \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc nextAuth \u062e\u0648\u062f \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc \u062f\u0647\u06cc\u0645.<\/p>\n<p>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0641\u06cc\u0644\u062f \u0633\u0627\u062f\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0646\u0642\u0634 \u062f\u0631 \u062c\u062f\u0648\u0644 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0628\u0627\u0634\u062f \u06a9\u0647 \u062f\u0627\u0631\u0627\u06cc \u06cc\u06a9 \u0645\u0642\u062f\u0627\u0631 \u0631\u0634\u062a\u0647 \u0627\u0633\u062a.  \u0627\u0645\u0627 \u0645\u0646 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644 \u0633\u0627\u062e\u062a\u0645 \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u0645 \u0647\u0631 \u062a\u0639\u062f\u0627\u062f \u0646\u0642\u0634\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u0628\u0633\u0627\u0632\u0645 \u0648 \u0628\u0647 \u0622\u0646 \u0645\u062c\u0648\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">roles<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">pgTable<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">roles<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">id<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">primaryKey<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">$defaultFn<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">createId<\/span><span class=\"p\">()),<\/span>\n  <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">name<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">notNull<\/span><span class=\"p\">(),<\/span>\n  <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">description<\/span><span class=\"dl\">\"<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">permissions<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">pgTable<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">permissions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">id<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">primaryKey<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">.<\/span><span class=\"nf\">$defaultFn<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">createId<\/span><span class=\"p\">()),<\/span>\n  <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">name<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">notNull<\/span><span class=\"p\">(),<\/span>\n  <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">description<\/span><span class=\"dl\">\"<\/span><span class=\"p\">),<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">rolePermissions<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">pgTable<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">role_permissions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">roleId<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">roleId<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">references<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">roles<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">onDelete<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">cascade<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n  <span class=\"na\">permissionId<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">permissionId<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">references<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">permissions<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">onDelete<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">cascade<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">}),<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">userRoles<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">pgTable<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">user_roles<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">userId<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">userId<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">references<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">users<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">onDelete<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">cascade<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n  <span class=\"na\">roleId<\/span><span class=\"p\">:<\/span> <span class=\"nf\">text<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">roleId<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nf\">references<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">roles<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">onDelete<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">cascade<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0627\u06cc\u062f NextAuthOption \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u0645 \u062a\u0627 \u0646\u0642\u0634\u200c\u0647\u0627 \u0648 \u0645\u062c\u0648\u0632\u0647\u0627 \u062f\u0631 \u062c\u0644\u0633\u0647 \u06a9\u0627\u0631\u0628\u0631 \u06af\u0646\u062c\u0627\u0646\u062f\u0647 \u0634\u0648\u0646\u062f.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u062a\u0648\u0627\u0628\u0639 \u067e\u0627\u0633\u062e \u0628\u0647 \u062a\u0645\u0627\u0633 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0646\u0642\u0634 \u0647\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code> <span class=\"nx\">callbacks<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">async<\/span> <span class=\"nf\">jwt<\/span><span class=\"p\">({<\/span> <span class=\"nx\">token<\/span><span class=\"p\">,<\/span> <span class=\"nx\">user<\/span> <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">user<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">role<\/span><span class=\"p\">,<\/span> <span class=\"nx\">permissions<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">getUserRoleAndPermissions<\/span><span class=\"p\">(<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n        <span class=\"nx\">token<\/span><span class=\"p\">.<\/span><span class=\"nx\">role<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">role<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">token<\/span><span class=\"p\">.<\/span><span class=\"nx\">permissions<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">permissions<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n      <span class=\"k\">return<\/span> <span class=\"nx\">token<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"k\">async<\/span> <span class=\"nf\">session<\/span><span class=\"p\">({<\/span> <span class=\"nx\">session<\/span><span class=\"p\">,<\/span> <span class=\"nx\">token<\/span> <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">token<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">token<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">role<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">token<\/span><span class=\"p\">.<\/span><span class=\"nx\">role<\/span><span class=\"p\">;<\/span>\n        <span class=\"nx\">session<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">permissions<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">token<\/span><span class=\"p\">.<\/span><span class=\"nx\">permissions<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">}<\/span>\n      <span class=\"k\">return<\/span> <span class=\"nx\">session<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">},<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0627\u0628\u0639 getRolesandPermission \u062f\u0642\u06cc\u0642\u0627\u064b \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u0627\u0632 drizzle \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u0642\u0634 \u0647\u0627 \u0648 \u0645\u062c\u0648\u0632 \u0627\u0632 db \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0647\u200c\u0637\u0648\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0627\u06cc\u0646 \u0628\u0647 \u062a\u0646\u0647\u0627\u06cc\u06cc \u06a9\u0627\u0631 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627\u06cc\u062f \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a\u06cc \u062f\u0631 \u0627\u0646\u0648\u0627\u0639 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kr\">declare<\/span> <span class=\"kr\">module<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next-auth<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kr\">interface<\/span> <span class=\"nx\">Session<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">user<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n      <span class=\"nl\">role<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n      <span class=\"nl\">permissions<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">[];<\/span>\n    <span class=\"p\">}<\/span> <span class=\"o\">&amp;<\/span> <span class=\"nx\">DefaultSession<\/span><span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">user<\/span><span class=\"dl\">\"<\/span><span class=\"p\">];<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kr\">declare<\/span> <span class=\"kr\">module<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next-auth\/jwt<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kr\">interface<\/span> <span class=\"nx\">JWT<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nl\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">role<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n    <span class=\"nl\">permissions<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">[];<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u062c\u0644\u0633\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0646\u0642\u0634 \u0647\u0627 \u0648 \u0645\u062c\u0648\u0632\u0647\u0627 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u0645.  \u0648 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u062f\u0631 \u0633\u0637\u062d \u0635\u0641\u062d\u0647 \u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u06a9\u0644 \u06af\u0631\u0648\u0647 \u0645\u0633\u06cc\u0631\u06cc \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u062d\u0627\u0641\u0638\u062a \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0631\u0648\u0634 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u06cc\u06a9 Sass \u0686\u0646\u062f \u0645\u0633\u062a\u0627\u062c\u0631 \u0648\u0627\u0642\u0639\u0627\u064b \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u062f \u0632\u06cc\u0631\u0627 \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0627\u0631\u0628\u0631 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u062c\u0627\u06cc \u062f\u06cc\u06af\u0631\u06cc \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f \u0627\u06cc\u0646 \u06cc\u06a9 \u0631\u0627\u0647 \u062d\u0644 \u0639\u0627\u0644\u06cc \u0627\u0633\u062a.  \u0628\u0631\u0627\u06cc \u0645\u0637\u0627\u0644\u0639\u0647 \u0627\u06cc\u0646 \u0645\u0637\u0644\u0628 \u0627\u0632 \u0634\u0645\u0627 \u0633\u067e\u0627\u0633\u06af\u0632\u0627\u0631\u0645 <\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0633\u0644\u0627\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06af\u0631 \u0634\u0645\u0627 \u0647\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u062a\u062d\u062f \u062a\u0627\u0631\u06cc\u06a9 \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062c\u0633\u062a\u062c\u0648\u06cc \u0631\u0627\u0647\u200c\u062d\u0644\u200c\u0647\u0627\u06cc Auth \u0648 \u0646\u0642\u0634\u200c\u0647\u0627\u06cc \u062e\u0648\u062f\u062a\u0627\u0646 \u0641\u06a9\u0631 \u0645\u06cc\u200c\u06a9\u0631\u062f\u06cc\u062f\u060c \u0627\u0645\u0627 \u0646\u062a\u0648\u0627\u0646\u0633\u062a\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0634\u0627\u06cc\u062f \u0647\u0645 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u06cc\u062f\u060c \u062f\u06cc\u06af\u0631 \u06a9\u0627\u0631 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u067e\u0633 \u062f\u0631 \u0645\u06a9\u0627\u0646 \u0645\u0646\u0627\u0633\u0628\u06cc \u0628\u0627 \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0633\u062a\u06cc\u062f. \u06a9\u062f \u0645\u0646 \u0646\u0633\u062e\u0647 \u0628\u0633\u062a\u0647 \u0647\u0627 \u0631\u0627 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":70281,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-70280","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/70280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=70280"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/70280\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/70281"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=70280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=70280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=70280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}