Can’t login and the modal shows the following message.
Unable to detect login share from the Auth Network. This may be due to slow internet connection. Check your internet speed and try again. If you’re using a vpn, please turn it off.
log
{"errorMsg":"Could not get result from torus nodes \n ","errorStack":"Error: Could not get result from torus nodes \n \n at _ (https://cyan.openlogin.com/v4/js/callback.fc9f8db8.js:1:13049https://cyan.openlogin.com/v4/js/callback.fc9f8db8.js:1:13049https://cyan.openlogin.com/v4/js/callback.fc9f8db8.js:1:13049:1:13049)\n at Proxy.created (https://cyan.openlogin.com/v4/js/callback.fc9f8db8.js:1:33979https://cyan.openlogin.com/v4/js/callback.fc9f8db8.js:1:33979https://cyan.openlogin.com/v4/js/callback.fc9f8db8.js:1:33979:1:33979)","title":"Mount Error","createdAt":"2024/12/3 9:43:28","info":{"customAuthState":{"client":"BAWhX4AH-1Xp-QwVW5jaCZK8TrveaTjr453CsHihUwQ1Brd5xqjlJyQOgXxgtsY3G0059MM856ploBhIierZmfM","currentLoginProvider":"jwt","popupWindow":"false","whiteLabel":"{\"name\":\"Kokudaka Project\",\"logoLight\":\"\",\"defaultLanguage\":\"jp\",\"theme\":{\"primary\":\"#000000\"}}","keyMode":"v1","isCustomVerifier":"true","socialFactorFlow":"","loginId":"759c0cafbad4ab1a75b3d66ad8055b01a099055a3e3845004c904e06fe925dd9","sessionNamespace":"","version":"4","instanceId":"2op07ishv58","verifier":"apple-questry","typeOfLogin":"jwt","redirectToOpener":false},"customAuthArgs":{"typeOfLogin":"jwt","verifier":"apple-questry","clientId":"1Pzj2usk5KkjXNAmO1gvxSxyfsJgXr8k","jwtParams":{"domain":"https://prd-questry.jp.auth0.com","verifierIdField":"sub"},"customState":{"client":"BAWhX4AH-1Xp-QwVW5jaCZK8TrveaTjr453CsHihUwQ1Brd5xqjlJyQOgXxgtsY3G0059MM856ploBhIierZmfM","currentLoginProvider":"jwt","popupWindow":"false","whiteLabel":"{\"name\":\"Kokudaka Project\",\"logoLight\":\"\",\"defaultLanguage\":\"jp\",\"theme\":{\"primary\":\"#000000\"}}","keyMode":"v1","isCustomVerifier":"true","socialFactorFlow":"","loginId":"759c0cafbad4ab1a75b3d66ad8055b01a099055a3e3845004c904e06fe925dd9","sessionNamespace":"","version":"4"},"hash":"access_token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIiwiaXNzIjoiaHR0cHM6Ly9wcmQtcXVlc3RyeS5qcC5hdXRoMC5jb20vIn0..kSs4oCGUfHh3rDsc.qfZKmAhjo1Rb7MJFGx7u5ClY3cIFKL89V91FM5ZV4kLGe1tLyuXv-w_7zfiVc2P2K-1795s2mqvueQUDLqzuzLxMFQIkfkswnAnjh_hErvcw3wZN0GN10wWyyOcrgaUfeDVefiMDFwF3Cf-qtj_aJSgp-5cFUlY5jvOj1-yote4pp0GJtpjZKQM7QwhWFkd8mlSwdPTATJ-weqPMxtxdEYwjcWVJHWobtOYNY2QW1Dq2S4Taorsf_T9RPy6jy9efeQS4zJQr98_WzHBBvapHJeJUgdnVqoKmbrxUSd50QFW_CKGIpr6XNInfs0A-AXHWEBx1ClM.Rs7AQvECmO1XWe6V0adVIg&scope=openid%20profile%20email&expires_in=7200&token_type=Bearer&state=eyJjbGllbnQiOiJCQVdoWDRBSC0xWHAtUXdWVzVqYUNaSzhUcnZlYVRqcjQ1M0NzSGloVXdRMUJyZDV4cWpsSnlRT2dYeGd0c1kzRzAwNTlNTTg1NnBsb0JoSWllclptZk0iLCJjdXJyZW50TG9naW5Qcm92aWRlciI6Imp3dCIsInBvcHVwV2luZG93IjoiZmFsc2UiLCJ3aGl0ZUxhYmVsIjoie1wibmFtZVwiOlwiS29rdWRha2EgUHJvamVjdFwiLFwibG9nb0xpZ2h0XCI6XCJcIixcImRlZmF1bHRMYW5ndWFnZVwiOlwianBcIixcInRoZW1lXCI6e1wicHJpbWFyeVwiOlwiIzAwMDAwMFwifX0iLCJrZXlNb2RlIjoidjEiLCJpc0N1c3RvbVZlcmlmaWVyIjoidHJ1ZSIsInNvY2lhbEZhY3RvckZsb3ciOiIiLCJsb2dpbklkIjoiNzU5YzBjYWZiYWQ0YWIxYTc1YjNkNjZhZDgwNTViMDFhMDk5MDU1YTNlMzg0NTAwNGM5MDRlMDZmZTkyNWRkOSIsInNlc3Npb25OYW1lc3BhY2UiOiIiLCJ2ZXJzaW9uIjoiNCIsImluc3RhbmNlSWQiOiIyb3AwN2lzaHY1OCIsInZlcmlmaWVyIjoiYXBwbGUtcXVlc3RyeSIsInR5cGVPZkxvZ2luIjoiand0IiwicmVkaXJlY3RUb09wZW5lciI6ZmFsc2V9&id_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjluUHB5Tk9hQ3pZcFBrQVVfSzlvMyJ9.eyJnaXZlbl9uYW1lIjoibmlrb3Jhc3VrZXBwYSIsIm5pY2tuYW1lIjoiZWt1c3VtYWtpbmFzeXV2aSIsIm5hbWUiOiJuaWtvcmFzdWtlcHBhIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0xvN3diMTliWUZFQ0VLZnJWVGtuMzlJWG5VZkFRMW5yVlplLXd3eXZhaHdrczY5dz1zOTYtYyIsInVwZGF0ZWRfYXQiOiIyMDI0LTEyLTAzVDAwOjQzOjIyLjYxNFoiLCJlbWFpbCI6ImVrdXN1bWFraW5hc3l1dmlAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImlzcyI6Imh0dHBzOi8vcHJkLXF1ZXN0cnkuanAuYXV0aDAuY29tLyIsImF1ZCI6IjFQemoydXNrNUtralhOQW1PMWd2eFN4eWZzSmdYcjhrIiwiaWF0IjoxNzMzMTg2NjAyLCJleHAiOjE3MzMxODY2NjIsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTAyNjEzNTMyNjE0NjUzNTY0MTQ0IiwiYXV0aF90aW1lIjoxNzMzMTg2NjAyLCJhdF9oYXNoIjoicnU4bnE1TEd6YlV1WTlUcWNWaHlodyIsInNpZCI6IlZadWFwVWJtRUpSaUtjUl9sZlZYVEhUaTQyLUxqNlNXIiwibm9uY2UiOiIyb3AwN2lzaHY1OCJ9.Z2_v_pI3F4OesA2W4xPA129bf612DbKS1K7HQajUsQfVEJGBR0hfA3kbaVdeQWT6YCHc254r8lZ-JKSGpkSontapHUZYx2uJE1Bf4QS9poFXKnOgzXX3sJIGgOC6T8gQSVt4S3NrpyJu_M9WRuKezf9VboPj4Q2rxDBDDsDsD0uhvNkp_M5JtzsgpEkF8Yei1dqaa_qEk2nVWTHOkosGeD1NdWlQ7u7slY__aZv4x9E9I2TfybfjQvJZdDZ_DXxA2NdMAZm_a7LWPKrVSMKWAmocoyz71XDSzRcc4JtfGJ-S5517HKbH-KqPQdAnffia7gXz-00mYKNqtIbr0J0XRA","queryParameters":{}},"customAuthError":"Could not get result from torus nodes \n ","customAuthHashParams":{"access_token":"eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIiwiaXNzIjoiaHR0cHM6Ly9wcmQtcXVlc3RyeS5qcC5hdXRoMC5jb20vIn0..kSs4oCGUfHh3rDsc.qfZKmAhjo1Rb7MJFGx7u5ClY3cIFKL89V91FM5ZV4kLGe1tLyuXv-w_7zfiVc2P2K-1795s2mqvueQUDLqzuzLxMFQIkfkswnAnjh_hErvcw3wZN0GN10wWyyOcrgaUfeDVefiMDFwF3Cf-qtj_aJSgp-5cFUlY5jvOj1-yote4pp0GJtpjZKQM7QwhWFkd8mlSwdPTATJ-weqPMxtxdEYwjcWVJHWobtOYNY2QW1Dq2S4Taorsf_T9RPy6jy9efeQS4zJQr98_WzHBBvapHJeJUgdnVqoKmbrxUSd50QFW_CKGIpr6XNInfs0A-AXHWEBx1ClM.Rs7AQvECmO1XWe6V0adVIg","scope":"openid%20profile%20email","expires_in":"7200","token_type":"Bearer","state":"eyJjbGllbnQiOiJCQVdoWDRBSC0xWHAtUXdWVzVqYUNaSzhUcnZlYVRqcjQ1M0NzSGloVXdRMUJyZDV4cWpsSnlRT2dYeGd0c1kzRzAwNTlNTTg1NnBsb0JoSWllclptZk0iLCJjdXJyZW50TG9naW5Qcm92aWRlciI6Imp3dCIsInBvcHVwV2luZG93IjoiZmFsc2UiLCJ3aGl0ZUxhYmVsIjoie1wibmFtZVwiOlwiS29rdWRha2EgUHJvamVjdFwiLFwibG9nb0xpZ2h0XCI6XCJcIixcImRlZmF1bHRMYW5ndWFnZVwiOlwianBcIixcInRoZW1lXCI6e1wicHJpbWFyeVwiOlwiIzAwMDAwMFwifX0iLCJrZXlNb2RlIjoidjEiLCJpc0N1c3RvbVZlcmlmaWVyIjoidHJ1ZSIsInNvY2lhbEZhY3RvckZsb3ciOiIiLCJsb2dpbklkIjoiNzU5YzBjYWZiYWQ0YWIxYTc1YjNkNjZhZDgwNTViMDFhMDk5MDU1YTNlMzg0NTAwNGM5MDRlMDZmZTkyNWRkOSIsInNlc3Npb25OYW1lc3BhY2UiOiIiLCJ2ZXJzaW9uIjoiNCIsImluc3RhbmNlSWQiOiIyb3AwN2lzaHY1OCIsInZlcmlmaWVyIjoiYXBwbGUtcXVlc3RyeSIsInR5cGVPZkxvZ2luIjoiand0IiwicmVkaXJlY3RUb09wZW5lciI6ZmFsc2V9","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjluUHB5Tk9hQ3pZcFBrQVVfSzlvMyJ9.eyJnaXZlbl9uYW1lIjoibmlrb3Jhc3VrZXBwYSIsIm5pY2tuYW1lIjoiZWt1c3VtYWtpbmFzeXV2aSIsIm5hbWUiOiJuaWtvcmFzdWtlcHBhIiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hL0FDZzhvY0xvN3diMTliWUZFQ0VLZnJWVGtuMzlJWG5VZkFRMW5yVlplLXd3eXZhaHdrczY5dz1zOTYtYyIsInVwZGF0ZWRfYXQiOiIyMDI0LTEyLTAzVDAwOjQzOjIyLjYxNFoiLCJlbWFpbCI6ImVrdXN1bWFraW5hc3l1dmlAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImlzcyI6Imh0dHBzOi8vcHJkLXF1ZXN0cnkuanAuYXV0aDAuY29tLyIsImF1ZCI6IjFQemoydXNrNUtralhOQW1PMWd2eFN4eWZzSmdYcjhrIiwiaWF0IjoxNzMzMTg2NjAyLCJleHAiOjE3MzMxODY2NjIsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTAyNjEzNTMyNjE0NjUzNTY0MTQ0IiwiYXV0aF90aW1lIjoxNzMzMTg2NjAyLCJhdF9oYXNoIjoicnU4bnE1TEd6YlV1WTlUcWNWaHlodyIsInNpZCI6IlZadWFwVWJtRUpSaUtjUl9sZlZYVEhUaTQyLUxqNlNXIiwibm9uY2UiOiIyb3AwN2lzaHY1OCJ9.Z2_v_pI3F4OesA2W4xPA129bf612DbKS1K7HQajUsQfVEJGBR0hfA3kbaVdeQWT6YCHc254r8lZ-JKSGpkSontapHUZYx2uJE1Bf4QS9poFXKnOgzXX3sJIGgOC6T8gQSVt4S3NrpyJu_M9WRuKezf9VboPj4Q2rxDBDDsDsD0uhvNkp_M5JtzsgpEkF8Yei1dqaa_qEk2nVWTHOkosGeD1NdWlQ7u7slY__aZv4x9E9I2TfybfjQvJZdDZ_DXxA2NdMAZm_a7LWPKrVSMKWAmocoyz71XDSzRcc4JtfGJ-S5517HKbH-KqPQdAnffia7gXz-00mYKNqtIbr0J0XRA"}}}
Implementation (React Native)
import {Platform} from 'react-native';
import Config from 'react-native-config';
import Web3Auth, {
LOGIN_PROVIDER,
OPENLOGIN_NETWORK,
} from '@web3auth/react-native-sdk';
import * as WebBrowser from '@toruslabs/react-native-web-browser';
import '@ethersproject/shims';
import {ethers} from 'ethers';
import AsyncStorage from '@react-native-async-storage/async-storage';
import {login, logout} from './nishiaizu';
import RNRestart from 'react-native-restart';
import axios from 'axios';
export const handleLoginProviderClick = onClose => {
const redirectUrl =
Platform.OS === 'android'
? Config.REDIRECT_URL_ANDROID
: Config.REDIRECT_URL_IOS;
const network =
Config.ENV === 'DEBUG' ? OPENLOGIN_NETWORK.TESTNET : OPENLOGIN_NETWORK.CYAN;
const whiteLabel = {
name: 'My Project',
logoLight: '',
defaultLanguage: 'jp',
theme: {
primary: '#000000',
},
};
const web3auth = new Web3Auth(WebBrowser, {
clientId: Config.WEB3AUTH_CLIENTID,
network: network,
whiteLabel: whiteLabel,
loginConfig: {
jwt: {
verifier: 'apple-questry',
typeOfLogin: 'jwt',
clientId: Config.AUTH0_CLIENTID,
},
},
});
web3auth
.login({
// https://web3auth.io/docs/sdk/pnp/react-native/custom-authentication#using-auth0-login
loginProvider: LOGIN_PROVIDER.JWT,
redirectUrl,
extraLoginOptions: {
domain: Config.AUTH0_DOMAIN,
verifierIdField: 'sub',
},
})
.then(async result => {
const wallet = new ethers.Wallet(result?.privKey ?? '');
const address = wallet.address;
const keyValues = [
['walletAddress', address],
['verifierId', result.userInfo.verifierId],
['oAuthIdToken', result.userInfo.oAuthIdToken],
['oAuthIdToken', result.userInfo.oAuthAccessToken],
['oAuthAccessToken', result.userInfo.oAuthAccessToken],
['web3authPrivKey', result.privKey],
['isUserLoggedIn', 'true'],
['isAfterLogIn', 'true'],
];
await AsyncStorage.multiSet(keyValues);
await login(
address,
result.privKey,
result.userInfo.name,
result.userInfo.email,
result.userInfo.verifierId,
);
onClose();
try {
RNRestart.Restart();
} catch (error) {
console.log('Restart Error: ', error);
}
})
.catch(error => {
console.error('Error: ', error);
});
};
export const handleLogoutProviderClick = async () => {
try {
const keys = [
'walletAddress',
'verifierId',
'oAuthIdToken',
'oAuthAccessToken',
'nishiaizuAccessToken',
'web3authPrivKey',
'isUserLoggedIn',
];
keys.forEach(async key => {
await AsyncStorage.removeItem(key);
});
await logout();
RNRestart.Restart();
} catch (error) {
console.error('logout failed: ', error);
}
};
/**
* Post Exit。
*/
// Auth0の認証トークンを取得
const getAuth0AccessToken = async () => {
const url = `${Config.AUTH0_DOMAIN}/oauth/token`;
const clientId = Config.AUTH0_CLIENTID;
const clientSecret = Config.AUTH0_CLIENTSECRET;
const audience = `${Config.AUTH0_DOMAIN}/api/v2/`;
try {
const response = await axios.post(url, {
grant_type: 'client_credentials',
client_id: clientId,
client_secret: clientSecret,
audience: audience,
});
const accessToken = response.data.access_token;
return accessToken;
} catch (error) {
console.error('Failed to retrieve access token:', error);
throw error;
}
};
export const exitFromQuestryApp = async (
setShowExitModal: React.Dispatch<React.SetStateAction<boolean>>,
) => {
let verifierId: string | null = ''; // auth0_user_id
let oAuthAccessToken: string | null = '';
let oAuthIdToken: string | null = '';
await AsyncStorage.multiGet([
'verifierId',
'oAuthIdToken',
'oAuthAccessToken',
]).then(data => {
verifierId = data[0][1];
oAuthIdToken = data[1][1];
oAuthAccessToken = data[2][1];
});
try {
const auth0AccessToken = await getAuth0AccessToken();
const axiosInstance = axios.create({
baseURL: `${Config.AUTH0_DOMAIN}/api/v2/`,
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${auth0AccessToken}`,
},
});
const url = `/users/${verifierId}`;
await axiosInstance.delete(url).then(async () => {
if (verifierId?.includes('apple')) {
const url = 'https://appleid.apple.com/auth/revoke';
const headers = {
'Content-Type': 'application/x-www-form-urlencoded',
};
const data = {
client_id: Config.KEYID,
client_secret: oAuthIdToken,
token: oAuthAccessToken,
token_type_hint: 'access_token',
};
const formData = new URLSearchParams();
for (const key in data) {
formData.append(key, data[key]);
}
try {
const response = await axios.post(url, formData.toString(), {
headers,
});
console.log('AccessToken revoked successfully.', response.status);
} catch (error) {
console.error(error);
}
}
() => handleLogoutProviderClick();
setShowExitModal(false);
});
console.log('User deleted successfully.');
} catch (error) {
console.error('Failed to delete user:', error);
throw new Error('User deletion failed.');
}
};