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 backendgetUserByEmail
#
Using - NodeJS
- GoLang
- Python
- Other Frameworks
Important
For other backend frameworks, you can follow our guide on how to spin up a separate server configured with the SuperTokens backend SDK to authenticate requests and issue session tokens.
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")
getUserById
#
Using - NodeJS
- GoLang
- Python
- Other Frameworks
Important
For other backend frameworks, you can follow our guide on how to spin up a separate server configured with the SuperTokens backend SDK to authenticate requests and issue session tokens.
- 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 frontendimportant
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();
}
}