WeChat sign-in with Embedded Wallets
WeChat Open Platform login lets users authenticate with a WeChat account. Choose the default connection for the quickest setup, or configure a custom connection when you need your own WeChat application, consent screen, or identity provider.
Default WeChat sign-in
The default connection uses the WeChat OAuth credentials managed by Embedded Wallets. You don't need a WeChat Open Platform application.
Caveats
- The WeChat consent screen identifies the OAuth application managed by Embedded Wallets, not your dapp.
- You can't change the WeChat application configuration, such as its scopes or branding, because you don't own the credentials.
- The default connection and a custom connection are separate connections, so they produce different wallet addresses for the same person unless you link them with a group connection.
Configure the default connection
- Open your project in the MetaMask Developer Dashboard.
- Select Social Connections.
- Enable WeChat.
The SDK reads the connection from the dashboard. You don't need to add WeChat credentials to your SDK configuration.
Custom WeChat sign-in
Use a custom connection when the WeChat authorization belongs to your dapp or an identity platform you control. Your WeChat credentials sit in Auth0 or your own backend.
Google, Discord, and Twitch connections take only a client ID, because they accept
https://auth.web3auth.io/auth as a redirect URI for a public client.
WeChat website login requires an AppSecret and an authorized callback domain you control, so
Embedded Wallets doesn't accept a WeChat App ID on the social connection.
Decide between the default and a custom connection before you onboard users. Moving from the default WeChat connection to Auth0 or your own JWT connection changes every user's wallet address unless both connections are in a group connection with matching user identifiers.
Auth0
Auth0 lists WeChat in the
social connections catalog.
Configure WeChat there, then create an Auth0 connection in the
MetaMask Developer Dashboard.
Set extraLoginOptions.connection to the name Auth0 assigned (commonly wechat).
Firebase Authentication and Amazon Cognito don't offer WeChat as a first-party social provider.
Your own backend
- Complete WeChat website login in your client and send the result to your backend.
- Exchange the authorization code with WeChat's token endpoint using your AppSecret, then validate the user identity before trusting it.
- Issue a fresh JWT with an
iatno more than 60 seconds old and expose the signing public key through a JSON Web Key Set (JWKS) endpoint. - Create a custom JWT connection that validates your issuer, audience, JWKS, and user identifier.
- Pass your JWT and custom connection ID to Embedded Wallets.
Don't send a WeChat AppSecret to a client application.
Group WeChat connections
A group connection gives the same person one wallet address across several login methods.
Default WeChat and WeChat through Auth0 are separate connections.
They produce different wallet addresses unless you group them and every connection in the group
uses the same JWT user identifier (email or an aligned sub).
Pass both the child connection ID and grouped connection ID when you bypass the modal:
await connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<WECHAT_AUTH_CONNECTION_ID>',
groupedAuthConnectionId: '<GROUPED_AUTH_CONNECTION_ID>',
idToken,
})
Usage examples
The implicit examples open a WeChat or Auth0 authorization flow. The JWT examples assume your Auth0 or backend integration has already returned a fresh ID token.
Default implicit flow
- React
- Vue
- JavaScript
- React Native
- Android
- iOS
- Flutter
- Unity
- Unreal Engine
import { AUTH_CONNECTION, WALLET_CONNECTORS } from '@web3auth/modal'
import { useWeb3AuthConnect } from '@web3auth/modal/react'
const { connectTo } = useWeb3AuthConnect()
await connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.WECHAT,
})
import { AUTH_CONNECTION, WALLET_CONNECTORS } from '@web3auth/modal'
import { useWeb3AuthConnect } from '@web3auth/modal/vue'
const { connectTo } = useWeb3AuthConnect()
await connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.WECHAT,
})
import { AUTH_CONNECTION, WALLET_CONNECTORS } from '@web3auth/modal'
await web3auth.connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.WECHAT,
})
import { AUTH_CONNECTION, useWeb3AuthConnect } from '@web3auth/react-native-sdk'
const { connectTo } = useWeb3AuthConnect()
await connectTo({
authConnection: AUTH_CONNECTION.WECHAT,
})
val response = web3Auth.connectTo(
LoginParams(AuthConnection.WECHAT)
)
let response = try await web3Auth.connectTo(
loginParams: LoginParams(authConnection: .WECHAT)
)
final response = await Web3AuthFlutter.login(
LoginParams(loginProvider: Provider.wechat),
);
var options = new LoginParams
{
loginProvider = Provider.WECHAT
};
web3Auth.login(options);
FWeb3AuthLoginParams LoginParams;
LoginParams.LoginProvider = TEXT("wechat");
UWeb3AuthSDK::GetInstance()->Login(LoginParams);
Auth0 implicit flow
These examples use the Auth0 custom connection configured for your SDK. Replace the connection ID and domain with your Auth0 values. For Android and iOS, add the connection to authConnectionConfig during initialization. Flutter, Unity, and Unreal Engine currently use their platform's loginConfig; configure it by following the custom authentication guide for Flutter, Unity, or Unreal Engine.
- React
- Vue
- JavaScript
- React Native
- Android
- iOS
- Flutter
- Unity
- Unreal Engine
await connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<AUTH0_CONNECTION_ID>',
extraLoginOptions: {
connection: 'wechat',
},
})
await connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<AUTH0_CONNECTION_ID>',
extraLoginOptions: {
connection: 'wechat',
},
})
await web3auth.connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<AUTH0_CONNECTION_ID>',
extraLoginOptions: {
connection: 'wechat',
},
})
await connectTo({
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<AUTH0_CONNECTION_ID>',
extraLoginOptions: {
connection: 'wechat',
},
})
val response = web3Auth.connectTo(
LoginParams(
authConnection = AuthConnection.CUSTOM,
authConnectionId = "<AUTH0_CONNECTION_ID>",
extraLoginOptions = ExtraLoginOptions(
domain = "https://<AUTH0_DOMAIN>",
connection = "wechat"
)
)
)
let response = try await web3Auth.connectTo(
loginParams: LoginParams(
authConnection: .CUSTOM,
authConnectionId: "<AUTH0_CONNECTION_ID>",
extraLoginOptions: ExtraLoginOptions(
domain: "https://<AUTH0_DOMAIN>",
connection: "wechat"
)
)
)
final response = await Web3AuthFlutter.login(
LoginParams(
loginProvider: Provider.jwt,
extraLoginOptions: ExtraLoginOptions(
domain: 'https://<AUTH0_DOMAIN>',
verifierIdField: 'sub',
connection: 'wechat',
),
),
);
var options = new LoginParams
{
loginProvider = Provider.JWT,
extraLoginOptions = new ExtraLoginOptions
{
domain = "https://<AUTH0_DOMAIN>",
verifierIdField = "sub",
connection = "wechat"
}
};
web3Auth.login(options);
The current Unreal Engine SDK documentation provides this flow through Blueprint configuration, not a verified C++ example. Configure the Auth0 connection by following the Unreal Engine custom authentication guide.
JWT flow
Obtain a fresh ID token from your identity aggregator or backend before calling Embedded Wallets. The token issuer and claims must match the custom connection in the dashboard.
- React
- Vue
- JavaScript
- React Native
- Android
- iOS
- Flutter
- Unity
- Unreal Engine
- Node.js
const idToken = await getIdToken()
await connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<CUSTOM_CONNECTION_ID>',
idToken,
})
const idToken = await getIdToken()
await connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<CUSTOM_CONNECTION_ID>',
idToken,
})
const idToken = await getIdToken()
await web3auth.connectTo(WALLET_CONNECTORS.AUTH, {
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<CUSTOM_CONNECTION_ID>',
idToken,
})
const idToken = await getIdToken()
await connectTo({
authConnection: AUTH_CONNECTION.CUSTOM,
authConnectionId: '<CUSTOM_CONNECTION_ID>',
idToken,
})
val response = web3Auth.connectTo(
LoginParams(
authConnection = AuthConnection.CUSTOM,
authConnectionId = "<CUSTOM_CONNECTION_ID>",
idToken = idToken
)
)
let response = try await web3Auth.connectTo(
loginParams: LoginParams(
authConnection: .CUSTOM,
authConnectionId: "<CUSTOM_CONNECTION_ID>",
idToken: idToken
)
)
final response = await Web3AuthFlutter.login(
LoginParams(
loginProvider: Provider.jwt,
extraLoginOptions: ExtraLoginOptions(
id_token: idToken,
),
),
);
var options = new LoginParams
{
loginProvider = Provider.JWT,
extraLoginOptions = new ExtraLoginOptions
{
id_token = idToken
}
};
web3Auth.login(options);
The current Unreal Engine SDK documentation doesn't provide a verified C++ JWT example. Configure the JWT connection and login in Blueprint by following the Unreal Engine custom authentication guide.
const result = await web3auth.connect({
authConnectionId: '<CUSTOM_CONNECTION_ID>',
idToken,
})