2018-10-10 18:03:03 -04:00
---
id: 589a8eb3f9fc0f352b528e72
title: Implementation of Social Authentication III
challengeType: 2
2020-08-16 04:43:26 +05:30
videoUrl: ''
localeTitle: 社会认证的实施III
2018-10-10 18:03:03 -04:00
---
## Description
2020-08-16 04:43:26 +05:30
<section id="description">提醒一下,这个项目是基于<a href="https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-socialauth/">Glitch</a>的以下入门项目构建的,或者是从<a href="https://github.com/freeCodeCamp/boilerplate-socialauth/">GitHub</a>克隆的。策略的最后一部分是处理从Github返回的配置文件。我们需要加载用户数据库对象( 如果存在) 或创建一个( 如果不存在) 并填充配置文件中的字段, 然后返回用户的对象。 Github在每个配置文件中为我们提供了一个唯一的<em>ID</em> ,我们可以使用它来搜索(已经实现)用户序列化。下面是您可以在项目中使用的示例实现 - 它位于作为新策略的第二个参数的函数内,就在<code>console.log(profile);</code>目前是: <pre> db.collection( ' ;socialusers' ;) 。findAndModify(
{id: profile.id},
{},
{$ setOnInsert: {
id: profile.id,
name: profile.displayName || ' ;John Doe' ;,
照片: profile.photos [0] .value || ”
电子邮件: profile.emails [0] .value || ' ;没有公开电子邮件' ;,
created_on: new Date( ) ,
provider: profile.provider || “
} $设置:{
last_login: 新日期( )
} $ INC {
login_count: 1
}},
{upsert: true, new: true},
( 错误, doc) => {
return cb( null, doc.value) ;
}
) ; </pre>使用findAndModify, 它允许您搜索对象并对其进行更新, 如果对象不存在则将其置换, 并在每次回调函数中接收新对象。在这个例子中, 我们总是将last_login设置为now, 我们总是将login_count增加1, 并且只有当我们插入一个新对象( 新用户) 时, 我们才会填充大部分字段。需要注意的是使用默认值。有时, 返回的个人资料不会填写所有信息, 或者用户会选择保留私密信息;所以在这种情况下我们必须处理它以防止错误。你现在应该可以登录你的应用了 - 试试吧!当您认为自己已经做对时,请提交您的页面。如果你正在运行到错误,您可以检查出的这个小项目的完成代码的例子<a href="https://glitch.com/#!/project/guttural-birch">在这里</a> 。 </section>
2018-10-10 18:03:03 -04:00
## Instructions
2020-08-16 04:43:26 +05:30
<section id="instructions">
2018-10-10 18:03:03 -04:00
</section>
## Tests
<section id='tests'>
```yml
tests:
2020-08-16 04:43:26 +05:30
- text: Github策略设置完成
2020-02-18 01:40:55 +09:00
testString: getUserInput => $.get(getUserInput('url')+ '/_api/server.js') .then(data => { assert.match(data, /GitHubStrategy[^]*db.collection/gi, 'Strategy should use now use the database to search for the user'); assert.match(data, /GitHubStrategy[^]*socialusers/gi, 'Strategy should use "socialusers" as db collection'); assert.match(data, /GitHubStrategy[^]*return cb/gi, 'Strategy should return the callback function "cb"'); }, xhr => { throw new Error(xhr.statusText); })
2018-10-10 18:03:03 -04:00
```
</section>
## Challenge Seed
<section id='challengeSeed'>
</section>
## Solution
<section id='solution'>
```js
2020-08-16 04:43:26 +05:30
// solution required
2018-10-10 18:03:03 -04:00
```
2020-08-13 17:24:35 +02:00
/section>