Get User Info
There are several ways to fetch information about a user:
- Using their user ID, you can get their email ID, time joined, and metadata that is saved in the user metadata recipe.
- Lastly, you can get the user's session information and access token payload from their session handle (offline mode), or from the currently logged in session object (online mode).
#
Fetching information using the user's email- NodeJS
- GoLang
- Python
- Other Frameworks
Important
You can get a user's information on the backend using the getUserByEmail
, getUserByPhoneNumber
and getUserById
functions:
import supertokens from "supertokens-node";
async function handler() {
let usersInfo = await supertokens.listUsersByAccountInfo("public", {
email: "test@example.com"
});
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
}
You can get a user's information on the backend using the GetUserByEmail
, GetUserByPhoneNumber
and GetUserById
functions:
import (
"fmt"
"github.com/supertokens/supertokens-golang/recipe/passwordless"
)
func main() {
tenantId := "public"
userInfo, err := passwordless.GetUserByEmail(tenantId, "test@example.com")
if err != nil {
// TODO: Handle error
return
}
fmt.Println(userInfo)
//...
}
- Asyncio
- Syncio
from supertokens_python.recipe.passwordless.asyncio import get_user_by_email
async def some_func():
_ = await get_user_by_email("public", "test@example.com")
from supertokens_python.recipe.passwordless.syncio import get_user_by_email
user_info = get_user_by_email("public", "test@example.com")
Multi Tenancy
Notice that we pass in the "public"
tenantId to the function call above. This is the default tenantID and will return the user with the given email that belongs to the public
tenant. You can provide a different tenantID if required.
#
Fetching information using the user's phone number- NodeJS
- GoLang
- Python
- Other Frameworks
Important
import supertokens from "supertokens-node";
async function handler() {
let usersInfo = await supertokens.listUsersByAccountInfo("public", {
phoneNumber: "+1234567890"
});
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
}
import (
"fmt"
"github.com/supertokens/supertokens-golang/recipe/passwordless"
)
func main() {
tenantId := "public"
userInfo, err := passwordless.GetUserByPhoneNumber(tenantId, "+1234567890")
if err != nil {
// TODO: Handle error
return
}
fmt.Println(userInfo)
//...
}
- Asyncio
- Syncio
from supertokens_python.recipe.passwordless.asyncio import get_user_by_phone_number
async def some_func():
_ = await get_user_by_phone_number("public", "+1234567890")
from supertokens_python.recipe.passwordless.syncio import get_user_by_phone_number
user_info = get_user_by_phone_number("public", "+1234567890")
Multi Tenancy
Notice that we pass in the "public"
tenantId to the function call above. This is the default tenantID and will return the user with the given phone number that belongs to the public
tenant. You can provide a different tenantID if required.
#
Fetching information using the user's IDgetUserById
function#
Using the - NodeJS
- GoLang
- Python
- Other Frameworks
Important
- Express
- Hapi
- Fastify
- Koa
- Loopback
- AWS Lambda / Netlify
- Next.js
- NestJS
import express from "express";
import supertokens from "supertokens-node";
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();
let userInfo = await supertokens.getUser(userId)
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
})
import supertokens from "supertokens-node";
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();
let userInfo = await supertokens.getUser(userId)
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
}
})
import Fastify from "fastify";
import supertokens from "supertokens-node";
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();
let userInfo = await supertokens.getUser(userId)
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
});
import supertokens from "supertokens-node";
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();
let userInfo = await supertokens.getUser(userId)
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
};
exports.handler = verifySession(getUserInfo);
import KoaRouter from "koa-router";
import supertokens from "supertokens-node";
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();
let userInfo = await supertokens.getUser(userId)
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
});
import { inject, intercept } from "@loopback/core";
import { RestBindings, MiddlewareContext, get, response } from "@loopback/rest";
import supertokens from "supertokens-node";
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();
let userInfo = await supertokens.getUser(userId)
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
}
}
import supertokens from "supertokens-node";
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();
let userInfo = await supertokens.getUser(userId)
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
}
import { Controller, Post, UseGuards, Request, Response } from "@nestjs/common";
import { AuthGuard } from './auth/auth.guard';
import { Session } from './auth/session.decorator';
import supertokens from "supertokens-node";
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();
let userInfo = await supertokens.getUser(userId)
/**
*
* userInfo contains the following info:
* - emails
* - id
* - timeJoined
* - tenantIds
* - phone numbers
* - third party login info
* - all the login methods associated with this user.
* - information about if the user's email is verified or not.
*
*/
return true;
}
}
- Chi
- net/http
- Gin
- Mux
import (
"fmt"
"net/http"
"github.com/supertokens/supertokens-golang/recipe/session"
"github.com/supertokens/supertokens-golang/recipe/passwordless"
)
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 := passwordless.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/passwordless"
)
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 := passwordless.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/passwordless"
)
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 := passwordless.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/passwordless"
)
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 := passwordless.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.passwordless.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.passwordless.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.passwordless.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)
#
Using the user metadata recipeCheckout the user metadata recipe docs which shows you how to save and fetch any JSON object against the user's ID. You can use this to save information like the user's name (first_name
and last_name
) or any other field associated with the user.
#
Getting information from the user's sessionThe user's session contains their user ID and the session's payload. You can access this on the backend and frontend as well as whilst the user is online or offline.
More information about this can be found in the session docs.