2017-02-07 11 views
0

私はクライアントでReact with Redux、サーバではNode.js with ExpressRest 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を認証するにはどうすればよいですか?

ありがとうございます!

+0

ユーザが認証された場合、JWTをサーバに送信する必要があります.fb Idだけでなく、何らかの理由でjwtにIDを含めることができます。セキュリティ上の理由から、CORSをバイパスすることはできません。また、JWTを認証ヘッダーに送信することもできます。 – Hosar

答えて

0

解決策は、accessTokenを含むサーバーからhttps://graph.facebook.com/meにGET要求を送信して、accessTokenをfacebook graphで検証することでした。