How can I differentiate between a request coming from the content-manager (in admin end) and API request in front-end when hooking into the life-cycle methods

Quite a late answer, but I think that

const ctx = strapi.requestContext.get()

should do the trick.

If it comes from the web there is a context, if it’s from the entityService or db.query it’s undefined :slight_smile:

However, this does not differentiate between content manager or API.

The way I solved that problem is with the following middleware:

import { Strapi } from '@strapi/strapi'
import jwt from 'jsonwebtoken'

export default (_index, { strapi }: { strapi: Strapi }) => {
  return async (ctx, next) => {
    if (!ctx.request.url.startsWith('/content-manager')) {
      ctx.state.isAdminUI = false
      return await next()
    }

    if (!ctx.request.header.authorization) {
      ctx.state.isAdminUI = false
      return await next()
    }
    const token = ctx.request.header.authorization.split(' ')[1]

    if (!token) {
      ctx.state.isAdminUI = false
      return await next()
    }

    const { secret } = strapi.config.get('admin.auth', {}) as any
    try {
      jwt.verify(ctx.request.header.authorization.split(' ')[1], secret)
      ctx.state.isAdminUI = true
    } catch {
      ctx.state.isAdminUI = false
    }

    await next()
  }
}

This middleware eventually checks if the authorization token of the request can be decoded with the admin auth secret.