Extend provider profile
Learn how to customize profile data from OAuth providers and customer payloads during external login.
Introduction
When users authenticate via external providers (Google, Facebook, or a custom
SSO), Front-Commerce extracts a standard profile containing email,
firstname, and lastname. However, you may need to:
- Extract additional fields from the OAuth provider's raw response (e.g., company, phone number, profile picture)
- Customize the customer creation payload sent to your e-commerce backend (e.g., add Magento2 custom attributes)
Front-Commerce provides two extension points for these use cases: Profile Transformers and Payload Transformers.
Profile Transformers
Profile transformers allow you to enrich the standard profile with custom fields extracted from the raw OAuth response.
Register a Profile Transformer
Use the registerProfileTransformer() method in your extension's
onServerServicesInit hook:
import { defineExtension } from "@front-commerce/core";
export default defineExtension({
name: "my-extension",
unstable_lifecycleHooks: {
onServerServicesInit(services) {
services.ExternalLogin.registerProfileTransformer({
name: "add-company-field",
transform: (profile, { rawProfile }) => ({
...profile,
company: rawProfile.raw._json?.organization,
}),
});
},
},
});
Profile Transformer API
The registerProfileTransformer method accepts an object with:
| Property | Type | Description |
|---|---|---|
name | string | Unique identifier for the transformer |
transform | (profile, context) => EnrichedProfile | Promise<EnrichedProfile> | Function that receives and returns the profile |
The transform function receives:
profile: The current profile object (withemail,firstname,lastnameand any fields added by previous transformers)context: An object containing:provider: The provider name (e.g.,"google","facebook")rawProfile: The raw OAuth response with{ provider, raw }structure
Transformers are applied in registration order. Each transformer receives the profile enriched by previous transformers.
Payload Transformers
Payload transformers allow you to customize the customer creation payload sent
to your e-commerce backend. This is particularly useful for Magento2 to add
custom_attributes or extension_attributes.
This feature is currently only available for Magento2. Support for other e-commerce backends may be added in future releases.
Register a Payload Transformer
Use the registerPayloadTransformer() method in your extension's
onServerServicesInit hook:
import { defineExtension } from "@front-commerce/core";
export default defineExtension({
name: "my-extension",
unstable_lifecycleHooks: {
onServerServicesInit(services) {
services.ExternalLogin.registerPayloadTransformer({
name: "add-custom-attributes",
transform: (payload, { profile }) => ({
...payload,
customer: {
...payload.customer,
custom_attributes: [
...(payload.customer?.custom_attributes ?? []),
{ attribute_code: "company", value: profile.company },
],
},
}),
});
},
},
});
Payload Transformer API
The registerPayloadTransformer method accepts an object with:
| Property | Type | Description |
|---|---|---|
name | string | Unique identifier for the transformer |
transform | (payload, context) => Record<string, unknown> | Promise<Record<string,unknown> | Function that receives and returns the payload |
The transform function receives:
payload: The current customer creation payloadcontext: An object containing:profile: The enriched profile (with all custom fields from profile transformers)storeLoginContext: Store context withstoreId,cartId,guestToken,orderIduser: The current Front-Commerce user object
Complete Example
Here's a complete example that extracts a company field from Google's OAuth response and adds it as a Magento2 custom attribute:
import { defineExtension } from "@front-commerce/core";
export default defineExtension({
name: "company-from-oauth",
unstable_lifecycleHooks: {
onServerServicesInit(services) {
// Step 1: Extract company from the raw OAuth profile
services.ExternalLogin.registerProfileTransformer({
name: "extract-company",
transform: (profile, { rawProfile, provider }) => {
// Google stores organization in _json.hd (hosted domain)
if (provider === "google") {
return {
...profile,
company: rawProfile.raw?._json?.hd,
};
}
// Facebook might have it in a different location
if (provider === "facebook") {
return {
...profile,
company: rawProfile.raw?._json?.company?.name,
};
}
return profile;
},
});
// Step 2: Add company to Magento2 custom_attributes
services.ExternalLogin.registerPayloadTransformer({
name: "add-company-attribute",
transform: (payload, { profile }) => {
if (!profile.company) {
return payload;
}
return {
...payload,
customer: {
...payload.customer,
custom_attributes: [
...(payload.customer?.custom_attributes ?? []),
{ attribute_code: "company", value: profile.company },
],
},
};
},
});
},
},
});
TypeScript Support
Front-Commerce exports all the types you need for type-safe transformers:
import type {
Profile,
EnrichedProfile,
RawOAuthProfile,
ProfileTransformer,
ProfileTransformerContext,
PayloadTransformer,
PayloadTransformerContext,
StoreLoginContext,
} from "@front-commerce/core/external-login";