私はクライアントでReact with Redux
、サーバではNode.js with Express
をRest API
として使用しています。 passport
でローカルログインを実装しましたが、Facebookログインなどのソーシャルログインを実装することもできません。React-Facebook-LoginとNode.js Express
ユーザーは認証され、AccessToken、Email、Name、IDなどの情報が返されます。これらの情報をサーバーに送信したい(別のポートで実行しています)そこにユーザをデータベース(MongoDb)に保存します。
がconst tokenForUser = (user) => {
const timestamp = new Date().getTime();
return jwt.encode({ sub: user._id, iat: timestamp }, SECRET);
};
トークンは、その後に使用することができます。ユーザーがデータベースに保存されている
const userSchema = Schema({
local: {
email: {
type: String,
unique: true,
},
password: String,
name: String
},
facebook: {
id: String,
token: String,
email: String,
name: String
},
...
た後、私はこの機能をクライアントにJWTtokenを返します。これは、ユーザー・スキーマが構成されている方法です認証する。
OK、ここが本当の問題です。 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 ID。その後、ユーザーはWebサイトへのアクセスを許可され、JWTトークンが返されます。
ユーザーがサーバー上で認証されたときにユーザーからのアクセストークンを認証する必要があります。 CORSをバイパスしてサーバー上のaccessTokenを認証するにはどうすればよいですか?
ありがとうございます!
ユーザが認証された場合、JWTをサーバに送信する必要があります.fb Idだけでなく、何らかの理由でjwtにIDを含めることができます。セキュリティ上の理由から、CORSをバイパスすることはできません。また、JWTを認証ヘッダーに送信することもできます。 – Hosar