Я использую 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?
Заранее благодарен!
Если пользователь аутентифицирован, ему необходимо отправить JWT на сервер, а не только идентификатор fb, jwt может содержать идентификатор, если вам это нужно по какой-либо причине. Вы не можете обойти CORS по соображениям безопасности. И вы можете отправить JWT на заголовок авторизации. – Hosar