2017-02-07 9 views
0

Я использую React with Redux на клиенте и Node.js with Express как Rest API на сервере. Я внедрил локальный логин с passport, но я также не буду внедрять социальный логин, например, для входа в Facebook.React-Facebook-Login и Node.js Express

Я использую react-facebook-login, где пользователь получает аутентификацию, а в ответ возвращается некоторая информация, в том числе AccessToken, электронная почта, имя, идентификатор и т. Д. Затем я хочу отправить эти данные на сервер (работающий на другом порту) и сохранить пользователя там в базе данных (MongoDb). Это, как устроена схема пользователя:

const userSchema = Schema({ 
    local: { 
    email: { 
     type: String, 
     unique: true, 
    }, 
    password: String, 
    name: String 
    }, 
    facebook: { 
    id: String, 
    token: String, 
    email: String, 
    name: String 
    }, 
... 

После того, как пользователь был сохранен в базе данных я возвращаю JWTtoken клиенту с помощью этой функции:

const tokenForUser = (user) => { 
    const timestamp = new Date().getTime(); 
    return jwt.encode({ sub: user._id, iat: timestamp }, SECRET); 
}; 

Маркер может быть использован для аутентификации.

ОК, вот настоящая проблема. При создании пользователя Facebook я сначала проверить, если пользователь существует, если нет, то создать его:

const facebookSignIn = (model, cb) => { 
    User.findOne({ 'facebook.id': model.id }, (err, docs) => { 
    if (err) { 
     return cb({ 'status': HTTP_INTERNAL_SERVER_ERROR, 
     'message': { error: 'Unable to search for an user due to an unknown error' } }); 
    } else if (docs) { 
     return cb(null, { token: tokenForUser(docs) }); 
    } 

    const user = new User({ 
     facebook: { 
     id: model.id, 
     token: model.accessToken, 
     email: model.email, 
     name: model.name 
     } 
    }); 

    user.save((err) => { 
     if (err) { 
     if (err.name === VALIDATION_ERROR) { 
      return cb({ 'status': HTTP_PRECONDITION_FAILED, 
      'message': { error: Object.keys(err.errors).map(e => `${err.errors[e].message} `) } }); 
     } 
     return cb({ 'status': HTTP_INTERNAL_SERVER_ERROR, 
      'message': { error: 'Unable to save user due to an unknown error' } }); 
     } 

     return cb(null, { token: tokenForUser(user) }); 
    }); 
    }); 
}; 

Если пользователь был идентифицирован (существует в базе данных), то может быть отправлен запрос на сервер только содержащий его/ее идентификатор Facebook. Затем пользователю будет разрешено войти на веб-сайт и будет возвращен JWTtoken.

Мне нужно аутентифицировать accessToken у пользователя, когда он аутентифицирован на сервере. Как я могу аутентифицировать accessToken на сервере, минуя CORS?

Заранее благодарен!

+0

Если пользователь аутентифицирован, ему необходимо отправить JWT на сервер, а не только идентификатор fb, jwt может содержать идентификатор, если вам это нужно по какой-либо причине. Вы не можете обойти CORS по соображениям безопасности. И вы можете отправить JWT на заголовок авторизации. – Hosar

ответ

0

Решение должно состоять в проверке доступа к Token с помощью facebook graph путем отправки запроса GET на адрес https://graph.facebook.com/me с сервера, содержащий accessToken.

 Смежные вопросы

  • Нет связанных вопросов^_^