userData de userSession.loadUserData() ne fonctionne pas de la même manière que les anciennes méthodes blockstack.js.
Avec l'autorisation précédente, je pouvais let person = new blockstack.Person(userData)
pour obtenir les données de profil « nom » et « avatar » définies par le navigateur. c'est à dire. person.name()
et person.avatarUrl()
.
Avec connect, le processus ci-dessus renvoie null
pour person.name() et person.avatarUrl(), même s'ils existent.
Il s'agit d'une régression pour les applications qui souhaitent autoriser un semblant de personnalisation.
Le problème est que le navigateur Blockstack hérité renvoie le profil dans le jeton authReponse récupéré à partir de l'URL du profil, tandis que la nouvelle application/authentificateur Blockstack ne fait pas cette recherche.
Les applications qui veulent toujours voir le profil d'un utilisateur doivent appeler le profil de recherche (http://blockstack.github.io/blockstack.js/globals.html#lookupprofile) je suppose.
loadUserData
toujours la même chose, il charge les données utilisateur disponibles dans le cache local (localstorage) fourni par l'authentificateur.
Fait intéressant, pour les applications qui demandent publish_data
l'authentificateur de connexion renvoie le profil.
@hstove réfléchit à l'ajout de cette prise en charge pour les applications solo ?
@friedger utilisant lookupProfile ne donne toujours pas accès à name() et avatarUrl() nécessaires à la personnalisation.
@dantrevino lookupProfile
renvoie une promesse d'un profil avec la propriété name
et image[i].contentUrl
si fourni par l'utilisateur.
@friedger je ne le vois pas. Qu'est-ce que je rate?
const userData = userSession.loadUserData();
const profile = blockstack.lookupProfile(userData.username);
console.log("profile loaded: ", profile);
profile loaded:
_proto__: Promise
constructor: ƒ Promise()
then: ƒ then()
catch: ƒ catch()
finally: ƒ finally()
Symbol(Symbol.toStringTag): "Promise"
__proto__: Object
<strong i="9">@type</strong>: "Person"
<strong i="10">@context</strong>: "http://schema.org"
apps: {http://localhost:8080: "https://gaia.blockstack.org/hub/1AdqWQnAMsb8uQsrZy96G2P7HYd1zkpMnr/", https://reclaim.gg: "https://gaia.blockstack.org/hub/1PcbTDbgybtTjkETvo9j5jr92VFKJ4rwWC/", https://boom-money-daily.runkodapps.com: "https://gaia.blockstack.org/hub/19wdVbKFyNqVVSuJf8ppt8P92LjUMdJjpz/", https://noteriot-daily.runkodapps.com: "https://gaia.blockstack.org/hub/1Br9sxhdSw6xQJ3x8vvQNkuAz5X5oAq7a5/", https://runkod.com: "https://gaia.blockstack.org/hub/1NpdmvGsNyisR56CUiZHfZHnZukMYiSjJ5/", …}
api: {gaiaHubConfig: {…}, gaiaHubUrl: "https://hub.blockstack.org"}
__proto__:
constructor: ƒ Object()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
hasOwnProperty: ƒ hasOwnProperty()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toString: ƒ toString()
valueOf: ƒ valueOf()
toLocaleString: ƒ toLocaleString()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
Pour les détails du profil manquant, voir https://github.com/blockstack/ux/issues/322
J'ai poussé un correctif sur l'authentificateur - il y avait des problèmes où nous ne récupérions pas correctement le profil avant le authResponse
. Veuillez réessayer et laissez-moi savoir si vous rencontrez le même problème.
@hstove fyi, cela ne fonctionne toujours pas en utilisant les méthodes de classe. Je me suis assuré que mon profil a un nom et un avatar :
https://gaia.blockstack.org/hub/1JE8MjzuSi19cBifCvrbsyAjx8PvwhakZp/profile.json
ma méthode de connexion :
signIn() {
const authOptions = {
// The URL you want the user to be redirected to after authentication.
redirectTo: "/wallet",
manifestPath: "/manifest.json",
sendToSignIn: true,
finished: ({ userSession }) => {
this.logInUser(userSession);
},
appDetails: {
name: "Boom.Webby",
icon: `${location.origin}/app-icon.png`,
},
};
authenticate(authOptions);
},
logInUser() :
logInUser(context, session) {
console.log("user session: ", session);
let userData = session.loadUserData();
let person = new blockstack.Person(userData);
userData.name = person.name();
userData.avatar = person.avatarUrl();
userData.authenticated = true;
console.log("userData: ", userData);
context.dispatch("setUser", userData);
},
et la sortie de console.log() .. notez que le nom et l'avatar sont toujours null
lors de l'utilisation des méthodes de classe :
{username: "fibonacci.id", profile: {…}, email: null, decentralizedID: "did:btc-addr:1JE8MjzuSi19cBifCvrbsyAjx8PvwhakZp", identityAddress: "1JE8MjzuSi19cBifCvrbsyAjx8PvwhakZp", …}
appPrivateKey: (...)
authResponseToken: (...)
authenticated: (...)
avatar: null
coreSessionToken: (...)
decentralizedID: (...)
email: (...)
gaiaAssociationToken: (...)
hubUrl: (...)
identityAddress: (...)
name: null
profile: (...)
username: (...)
Cependant, lorsque je regarde blockstack-session
dans le stockage local, les accessoires de nom et d'image sont là.
userData: {username: "fibonacci.id", profile: {<strong i="21">@type</strong>: "Person", <strong i="22">@context</strong>: "http://schema.org",…}, email: null,…}
appPrivateKey: "..."
.
.
.
profile: {<strong i="23">@type</strong>: "Person", <strong i="24">@context</strong>: "http://schema.org",…}
.
.
.
image: [{<strong i="25">@type</strong>: "ImageObject", name: "avatar",…}]
name: "Fibonacci"
username: "fibonacci.id"
version: "1.0.0"
Je ne le vois pas. Qu'est-ce que je rate?
@dantravino le problème ici est que lookupProfile
renvoie une promesse, et vous n'utilisez pas await
. Donc, ce que vous obtenez en retour est une promesse.
Merci d'avoir suivi le problème qui persiste lorsque vous utilisez la classe Person
- je vais y réfléchir.
Hé @dantravino - on dirait que vous devez simplement appeler new Person(userData.profile)
, au lieu de new Person(userData)
. Peut-être que cela fonctionnait différemment pour vous avant ? Mais c'est conforme à la doc ici :
https://blockstack.github.io/blockstack.js/index.html#quickstart -build-an-application