Which UI do you use?
Pre built UI
Custom UI
Get User Info
You can fetch user information on the backend as well as on the frontend.
Fetching on the backend#
Using getUserByEmail#
- NodeJS
 - GoLang
 - Python
 
You can get a user's information on the backend using the getUsersByEmail and getUserById functions:
import ThirdParty from "supertokens-node/recipe/thirdparty";
async function getUserInfo() {
    // Note that usersInfo has type User[]
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    let usersInfo = await ThirdParty.getUsersByEmail("test@example.com");
}
You can get a user's information on the backend using the GetUsersByEmail and GetUserById functions:
import (
    "fmt"
    "github.com/supertokens/supertokens-golang/recipe/thirdparty"
)
func main() {
    // Note that usersInfo has type User[]
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    usersInfo, err := thirdparty.GetUsersByEmail("test@example.com")
    if err != nil {
        // TODO: Handle error
        return
    }
    fmt.Println(usersInfo)
    //...
}
- Asyncio
 - Syncio
 
from supertokens_python.recipe.thirdparty.asyncio import get_users_by_email
async def some_func():
    # Note that users_info has type List[User]
    _ = await get_users_by_email("test@example.com")
from supertokens_python.recipe.thirdparty.syncio import get_users_by_email
# Note that users_info has type List[User]
# You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki 
users_info = get_users_by_email("test@example.com")
Using getUserById#
- NodeJS
 - GoLang
 - Python
 
- Express
 - Hapi
 - Fastify
 - Koa
 - Loopback
 - AWS Lambda / Netlify
 - Next.js
 - NestJS
 
import express from "express";
import ThirdParty from "supertokens-node/recipe/thirdparty";
import { verifySession } from "supertokens-node/recipe/session/framework/express";
import { SessionRequest } from 'supertokens-node/framework/express';
let app = express();
app.get("/get-user-info", verifySession(), async (req: SessionRequest, res) => {
    let userId = req.session!.getUserId();
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    let userInfo = await ThirdParty.getUserById(userId)
    // ... 
})
import ThirdParty from "supertokens-node/recipe/thirdparty";
import { verifySession } from "supertokens-node/recipe/session/framework/hapi";
import Hapi from "@hapi/hapi";
import { SessionRequest } from "supertokens-node/framework/hapi";
let server = Hapi.server({ port: 8000 });
server.route({
    path: "/get-user-info",
    method: "get",
    options: {
        pre: [
            {
                method: verifySession()
            },
        ],
    },
    handler: async (req: SessionRequest, res) => {
        let userId = req.session!.getUserId();
        // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
        let userInfo = await ThirdParty.getUserById(userId);
        //...
    }
})
import Fastify from "fastify";
import ThirdParty from "supertokens-node/recipe/thirdparty";
import { verifySession } from "supertokens-node/recipe/session/framework/fastify";
import { SessionRequest } from 'supertokens-node/framework/fastify';
const fastify = Fastify();
fastify.post("/like-comment", {
    preHandler: verifySession(),
}, async (req: SessionRequest, res) => {
    let userId = req.session!.getUserId();
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    let userInfo = await ThirdParty.getUserById(userId);
    //....
});
import ThirdParty from "supertokens-node/recipe/thirdparty";
import { verifySession } from "supertokens-node/recipe/session/framework/awsLambda";
import { SessionEvent } from "supertokens-node/framework/awsLambda";
async function getUserInfo(awsEvent: SessionEvent) {
    let userId = awsEvent.session!.getUserId();
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    let userInfo = await ThirdParty.getUserById(userId);
    //....
};
exports.handler = verifySession(getUserInfo);
import KoaRouter from "koa-router";
import ThirdParty from "supertokens-node/recipe/thirdparty";
import { verifySession } from "supertokens-node/recipe/session/framework/koa";
import { SessionContext } from "supertokens-node/framework/koa";
let router = new KoaRouter();
router.get("/get-user-info", verifySession(), async (ctx: SessionContext, next) => {
    let userId = ctx.session!.getUserId();
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    let userInfo = await ThirdParty.getUserById(userId);
    //....
});
import { inject, intercept } from "@loopback/core";
import { RestBindings, MiddlewareContext, get, response } from "@loopback/rest";
import  ThirdParty from "supertokens-node/recipe/thirdparty";
import { verifySession } from "supertokens-node/recipe/session/framework/loopback";
import Session from "supertokens-node/recipe/session";
import { SessionContext } from "supertokens-node/framework/loopback";
class GetUserInfo {
    constructor(@inject(RestBindings.Http.CONTEXT) private ctx: MiddlewareContext) {}
    @get("/get-user-info")
    @intercept(verifySession())
    @response(200)
    async handler() {
        let userId = ((this.ctx as any).session as Session.SessionContainer).getUserId();
        // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
        let userInfo = await ThirdParty.getUserById(userId);
        //....
    }
}
import ThirdParty from "supertokens-node/recipe/thirdparty";
import { superTokensNextWrapper } from 'supertokens-node/nextjs'
import { verifySession } from "supertokens-node/recipe/session/framework/express";
import { SessionRequest } from "supertokens-node/framework/express";
export default async function likeComment(req: SessionRequest, res: any) {
    await superTokensNextWrapper(
        async (next) => {
            await verifySession()(req, res, next);
        },
        req,
        res
    )
    let userId = req.session!.getUserId();
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    let userInfo = await ThirdParty.getUserById(userId);
    //....
}
import { Controller, Post, UseGuards, Request, Response } from "@nestjs/common";
import { AuthGuard } from './auth/auth.guard';
import { Session } from './auth/session.decorator';
import ThirdParty from "supertokens-node/recipe/thirdparty";
import { SessionRequest } from "supertokens-node/framework/express";
@Controller()
export class ExampleController {
  @Post('example')
  @UseGuards(new AuthGuard()) // For more information about this guard please read our NestJS guide.
  async postExample(@Request() req: SessionRequest, @Session() session: Session, @Response({passthrough: true}) res: Response): Promise<boolean> {
    let userId = session.getUserId();
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    let userInfo = await ThirdParty.getUserById(userId); 
    //....
    return true;
  }
}
- Chi
 - net/http
 - Gin
 - Mux
 
import (
    "fmt"
    "net/http"
    "github.com/supertokens/supertokens-golang/recipe/session"
    "github.com/supertokens/supertokens-golang/recipe/thirdparty"
)
func main() {
    _ = http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
        session.VerifySession(nil, getUserInfoAPI).ServeHTTP(rw, r)
    })
}
func getUserInfoAPI(w http.ResponseWriter, r *http.Request) {
    sessionContainer := session.GetSessionFromRequestContext(r.Context())
    userID := sessionContainer.GetUserID()
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    userInfo, err := thirdparty.GetUserByID(userID)
    if err != nil {
        // TODO: Handle error
        return
    }
    fmt.Println(userInfo)
}
import (
    "fmt"
    "net/http"
    "github.com/gin-gonic/gin"
    "github.com/supertokens/supertokens-golang/recipe/session"
    "github.com/supertokens/supertokens-golang/recipe/session/sessmodels"
    "github.com/supertokens/supertokens-golang/recipe/thirdparty"
)
func main() {
    router := gin.New()
    router.GET("/getuserinfo", verifySession(nil), getUserInfoAPI)
}
func verifySession(options *sessmodels.VerifySessionOptions) gin.HandlerFunc {
    return func(c *gin.Context) {
        session.VerifySession(options, func(rw http.ResponseWriter, r *http.Request) {
            c.Request = c.Request.WithContext(r.Context())
            c.Next()
        })(c.Writer, c.Request)
        // we call Abort so that the next handler in the chain is not called, unless we call Next explicitly
        c.Abort()
    }
}
func getUserInfoAPI(c *gin.Context) {
    sessionContainer := session.GetSessionFromRequestContext(c.Request.Context())
    userID := sessionContainer.GetUserID()
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    userInfo, err := thirdparty.GetUserByID(userID)
    if err != nil {
        // TODO: Handle error
        return
    }
    fmt.Println(userInfo)
    //...
}
import (
    "fmt"
    "net/http"
    "github.com/go-chi/chi"
    "github.com/supertokens/supertokens-golang/recipe/session"
    "github.com/supertokens/supertokens-golang/recipe/thirdparty"
)
func main() {
    r := chi.NewRouter()
    r.Get("/getuserinfo", session.VerifySession(nil, getUserInfoAPI))
}
func getUserInfoAPI(w http.ResponseWriter, r *http.Request) {
    sessionContainer := session.GetSessionFromRequestContext(r.Context())
    userID := sessionContainer.GetUserID()
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    userInfo, err := thirdparty.GetUserByID(userID)
    if err != nil {
        // TODO: Handle error
        return
    }
    fmt.Println(userInfo)
}
import (
    "fmt"
    "net/http"
    "github.com/gorilla/mux"
    "github.com/supertokens/supertokens-golang/recipe/session"
    "github.com/supertokens/supertokens-golang/recipe/thirdparty"
)
func main() {
    router := mux.NewRouter()
    router.HandleFunc("/getuserinfo", session.VerifySession(nil, getUserInfoAPI)).Methods(http.MethodGet)
}
func getUserInfoAPI(w http.ResponseWriter, r *http.Request) {
    sessionContainer := session.GetSessionFromRequestContext(r.Context())
    userID := sessionContainer.GetUserID()
    // You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    userInfo, err := thirdparty.GetUserByID(userID)
    if err != nil {
        // TODO: Handle error
        return
    }
    fmt.Println(userInfo)
}
- FastAPI
 - Flask
 - Django
 
from supertokens_python.recipe.session.framework.fastapi import verify_session
from supertokens_python.recipe.thirdparty.asyncio import get_user_by_id
from supertokens_python.recipe.session import SessionContainer
from fastapi import FastAPI, Depends
app = FastAPI()
@app.post('/get_user_info_api') 
async def get_user_info_api(session: SessionContainer = Depends(verify_session())):
    user_id = session.get_user_id()
    # You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    _ = await get_user_by_id(user_id)
from supertokens_python.recipe.session.framework.flask import verify_session
from supertokens_python.recipe.thirdparty.syncio import get_user_by_id
from flask import Flask, g
from supertokens_python.recipe.session import SessionContainer
app = Flask(__name__)
@app.route('/update-jwt', methods=['POST']) 
@verify_session()
def get_user_info_api():
    session: SessionContainer = g.supertokens 
    user_id = session.get_user_id()
    # You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    _ = get_user_by_id(user_id)
from supertokens_python.recipe.session.framework.django.asyncio import verify_session
from supertokens_python.recipe.thirdparty.asyncio import get_user_by_id
from django.http import HttpRequest
from supertokens_python.recipe.session import SessionContainer
@verify_session()
async def get_user_info_api(request: HttpRequest):
    session: SessionContainer = request.supertokens 
    user_id = session.get_user_id()
    # You can learn more about the `User` object over here https://github.com/supertokens/core-driver-interface/wiki
    _ = await get_user_by_id(user_id)
Fetching on the frontend#
important
The function calls below require no API calls and read directly from the session information stored on the frontend. This makes them very quick.
- ReactJS
 - Angular
 - Vue
 
import Session from 'supertokens-auth-react/recipe/session';
async function getUserInfo() {
    if (await Session.doesSessionExist()) {
        let userId = await Session.getUserId();
        let accessTokenPayload = await Session.getAccessTokenPayloadSecurely();
    }
}
- With React Context
 - Without React Context
 
import React from "react";
import { useSessionContext } from 'supertokens-auth-react/recipe/session'; 
// Your dashboard component
function Dashboard(props: any) {
    let session = useSessionContext();
    if (session.loading) {
        return null;
    }
    let {doesSessionExist, userId, accessTokenPayload} = session;
    // doesSessionExist will always be true if this is wrapped in `<SessionAuth>`
    if (!doesSessionExist) {
        // TODO
    }
    let name = accessTokenPayload.userName;
}
import Session from 'supertokens-auth-react/recipe/session';
async function getUserInfo() {
    if (await Session.doesSessionExist()) {
        let userId = await Session.getUserId();
        let accessTokenPayload = await Session.getAccessTokenPayloadSecurely();
    }
}
import Session from 'supertokens-auth-react/recipe/session';
async function getUserInfo() {
    if (await Session.doesSessionExist()) {
        let userId = await Session.getUserId();
        let accessTokenPayload = await Session.getAccessTokenPayloadSecurely();
    }
}