login

PHOTO EMBED

Sun Jul 23 2023 14:23:17 GMT+0000 (Coordinated Universal Time)

Saved by @nelson22

src > app > api > users > login > route.ts

import {connect} from '@/dbConfig/dbConfig';
import Users from '@/models/userModel';
import { NextRequest, NextResponse } from 'next/server';
import bcryptjs from 'bcryptjs';
import jwt from 'jsonwebtoken';

connect();

export async function POST(request: NextRequest){
    try {
        const reqBody = await request.json();
        const {email, password} = reqBody;

        // check if user exists
        const user = await Users.findOne({email});
        if(!user){
            return NextResponse.json({error: 'User not present'}, {status: 400});
        }

        // check password
        const validPassword = await bcryptjs.compare(password, user.password);
        if(!validPassword){
            return NextResponse.json({error: 'Password not valid'}, {status: 400});
        }

        // create token data
        const tokenData = {
            id: user._id,
            username: user.username,
            email: user.email
        }

        // create json token
        const token = await jwt.sign(tokenData, process.env.TOKEN_SECRET!, {expiresIn: "1h"});
        const response = NextResponse.json({
            message: 'Login successfull',
            success: true
        })
        response.cookies.set('token', token, {
            httpOnly: true
        })
        return response;
    } catch (error: any) {
        return NextResponse.json({error: error.message}, {status: 500});
    }
}

----------------------------------------------------------------

src > app > login > page.tsx

"use client";
import React from "react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import axios from "axios";

export default function LoginPage(){
    const router = useRouter();
    const [user, setUser] = React.useState({
        email: '',
        password: ''
    })

    const loginUser = async () => {
        try {
            const response = await axios.post("/api/users/login", user);
            router.push('/profile');
        } catch (error) {
            console.log(error);
        }
    }
    return(
        <div>
            <h1 className="page-hd">Login</h1>
            <form>
                <input type="text" placeholder="email" value={user.email} className="form-input" onChange={e => setUser({...user, email: e.target.value})} /><br />
                <input type="password" placeholder="password" value={user.password} className="form-input" onChange={e => setUser({...user, password: e.target.value})} /><br />
                <input type="button" value="Submit" className="btn" onClick={loginUser} />
            </form>
            <Link className="link" href="/signup">Back to Sign up</Link>
        </div>
    )
}

content_copyCOPY