81 lines
2.9 KiB
Markdown
81 lines
2.9 KiB
Markdown
---
|
|
id: 589a8eb3f9fc0f352b528e72
|
|
title: Implementazione dell'autenticazione con i social III
|
|
challengeType: 2
|
|
forumTopicId: 301558
|
|
dashedName: implementation-of-social-authentication-iii
|
|
---
|
|
|
|
# --description--
|
|
|
|
La parte finale della strategia è gestire il profilo restituito da GitHub. Dobbiamo caricare l'oggetto del database relativo all'uutente se esiste, o crearne uno se non esiste, e popolare i campi dal profilo, quindi restituire l'oggetto dell'utente. GitHub ci fornisce un *id* unico per ogni profilo che possiamo usare per cercare e serializzare l'utente (già implementato). Di seguito è riportato un esempio di implementazione che puoi usare nel tuo progetto: va all'interno della funzione che è il secondo argomento per la nuova strategia, proprio sotto all'attuale posizione di `console.log(profile);`:
|
|
|
|
```js
|
|
myDataBase.findOneAndUpdate(
|
|
{ id: profile.id },
|
|
{
|
|
$setOnInsert: {
|
|
id: profile.id,
|
|
name: profile.displayName || 'John Doe',
|
|
photo: profile.photos[0].value || '',
|
|
email: Array.isArray(profile.emails)
|
|
? profile.emails[0].value
|
|
: 'No public email',
|
|
created_on: new Date(),
|
|
provider: profile.provider || ''
|
|
},
|
|
$set: {
|
|
last_login: new Date()
|
|
},
|
|
$inc: {
|
|
login_count: 1
|
|
}
|
|
},
|
|
{ upsert: true, new: true },
|
|
(err, doc) => {
|
|
return cb(null, doc.value);
|
|
}
|
|
);
|
|
```
|
|
|
|
`findOneAndUpdate` ti permette di cercare un oggetto e aggiornarlo. Se l'oggetto non esiste, verrà inserito e reso disponibile alla funzione di callback. In questo esempio, abbiamo sempre impostato `last_login`, incrementato il `login_count` di `1`, e popolato la maggior parte dei campi solo quando viene inserito un nuovo oggetto (nuovo utente). Nota l'uso dei valori predefiniti. A volte un profilo restituito non avrà tutte le informazioni compilate o l'utente lo manterrà privato. Dovrai gestire questo caso per evitare un errore.
|
|
|
|
Ora dovresti essere in grado di accedere alla tua app, provala!
|
|
|
|
Invia la tua pagina quando pensi di averlo fatto correttamente. Se incontri degli errori, puoi controllare il progetto completato fino a questo punto [qui](https://gist.github.com/camperbot/183e968f0e01d81dde015d45ba9d2745).
|
|
|
|
# --hints--
|
|
|
|
La configurazione della strategia GitHub dovrebbe essere completa.
|
|
|
|
```js
|
|
(getUserInput) =>
|
|
$.get(getUserInput('url') + '/_api/auth.js').then(
|
|
(data) => {
|
|
assert.match(
|
|
data,
|
|
/GitHubStrategy[^]*myDataBase/gi,
|
|
'Strategy should use now use the database to search for the user'
|
|
);
|
|
assert.match(
|
|
data,
|
|
/GitHubStrategy[^]*return cb/gi,
|
|
'Strategy should return the callback function "cb"'
|
|
);
|
|
},
|
|
(xhr) => {
|
|
throw new Error(xhr.statusText);
|
|
}
|
|
);
|
|
```
|
|
|
|
# --solutions--
|
|
|
|
```js
|
|
/**
|
|
Backend challenges don't need solutions,
|
|
because they would need to be tested against a full working project.
|
|
Please check our contributing guidelines to learn more.
|
|
*/
|
|
```
|