2016-04-02 49 views
0

Nodejs arka uç sunucusu REST API'sı ile iletişim kuran bir iOS uygulamasında çalışıyorum ve API kimlik doğrulaması hakkında düşünüyorum.node.js API kimlik doğrulaması

Yalnızca iOS uygulamasının API ile iletişim kurabileceğini istiyorum.

iOS uygulama tarafında, kullanıcılar Facebook oturum açma yoluyla doğrulanır. Böylece, iOS uygulamasında kimlik doğrulamasından sonra bir fb access_token ve bir fbid alırlar. API kimlik doğrulaması için

, ben bu şekilde yapmayı planlıyorsanız: iOS uygulaması, bir çağrı içine kullanıcı günlükleri/API/auth onun fb access_token ve fbid ile

  • yapılır için; Kullanıcı yeniyse
  • , ben Kullanıcılar veritabanına saklayın ve iOS uygulaması için geri göndermek, bu kullanıcı için rasgele bir api_token oluşturmak; Kullanıcı DB zaten varsa
  • , benim DB fb access_token ve api_token yenileyin ve iOS uygulamasında geri gönder; her API çağrısı için
  • , ben bir POST parametre olarak api_token vermek ve onu API çağrısı yürütmeden önce DB alma yoluyla geçerli olup olmadığını sunucu tarafında ben kontrol edin.

mıyım emniyete yeterli olması bir şey eksik?

Herhangi bir geri bildirim veya iyileştirme çok memnuniyetle karşılanacaktır.

Selamlar,

DÜZENLEME:/API/auth On

  • Ben FacebookB API (/ me) fb ACCESS_TOKEN hala geçerli olup olmadığını kontrol:

diğer bir yolu takip olurdu ;

  • Eğer kimlik doğrulamasını reddetmiyorum;
  • Evet ise api_token'ı JSON Web Jetonları ile oluşturup yönetiyorum. Herkes ilgi ise
  • cevap

    0

    , nihayet ikinci çözümünü uyguladı. Çok basit ve işini yap!

    config.js

    module.exports = { 
        'secret': 'apisupersecrethere', 
    }; 
    

    route.js

    var config = require('./config'); 
    app.set('api_secret', config.secret); 
    api = express.Router(); 
    
    // function that checks the api_token 
    api.use(function(req, res, next) { 
        var token = req.headers['x-access-token']; 
        if (token) { 
         jwt.verify(token,app.get('api_secret'),function(err, decoded) { 
          if (err) { 
           return res.json({ 
            success: false, 
            message: 'Failed to authenticate token.' 
           }); 
          } else { 
           req.decoded = decoded; 
           next(); 
          } 
         }); 
        } else { 
         return res.status(403).send({ 
          success: false, 
          message: 'No token provided.' 
         }); 
        } 
    }); 
    
    // route protected by the authentication 
    router.use('/users', api); 
    
    // authentication route 
    router.post('/auth', function(req, res) { 
        verifyFacebookUserAccessToken(req.body.access_token). 
         then(function(user) { 
          var token = jwt.sign(user, app.get('api_secret'), { 
           expiresIn: 1440*60 // expires in 24 hours 
          }); 
          res.status(200).json({ 
           success: true, 
           message: "Authentication success!", 
           token: token 
          }); 
         }, function(error) { 
          res.status(401).json({ 
           success: false, 
           message: error.message 
          }); 
         }). 
         catch(function(error){ 
          res.status(500).json({ 
           success: false, 
           message: error.message 
          }); 
         }); 
        }); 
    
    // Call facebook API to verify the token is valid 
    function verifyFacebookUserAccessToken(token) { 
        var deferred = Q.defer(); 
        var path = 'https://graph.facebook.com/me?access_token=' + token; 
        request(path, function (error, response, body) { 
         var data = JSON.parse(body); 
         if (!error && response && response.statusCode && response.statusCode == 200) { 
          var user = { 
           facebookUserId: data.id, 
           username: data.username, 
           firstName: data.first_name, 
           lastName: data.last_name, 
           email: data.email 
         }; 
          deferred.resolve(user); 
         } 
         else { 
          deferred.reject({ 
           code: response.statusCode, 
           message: data.error.message 
          }); 
         } 
        }); 
        return deferred.promise; 
    } 
    

    karşıladı türlü geri bildirim

    .

    Selamlar

    İlgili konular