2016-10-12 1 views
0

Я пытаюсь обеспечить аутентификацию моего отдыха api, поэтому только доверенные приложения могут использовать этот api. Я искал лучшие практики и руководства, но ни один из них на самом деле не объясняет это в реальном мире.Защита остального api с помощью jwt

Я создал jsonwebtoken аутентификации, подобную этой:

if(!user){ 
    res.json({success:false, message: 'auth failed, user not found'}); 
} else { 
    var token = jwt.sign(user, app.get('superSecret'), { 
     expiresIn: 1440 //24 hours 
    }); 
    res.json({ 
     success: true, 
     message: 'token generated', 
     token: token 
    }); 
} 

Это хорошо работает, возвращая токен, который я могу затем передавать все запросы к API, но как я могу сделать приложение найти этот маркер и использование он вместо этого вручную передает токен каждый вызов api?

Я видел, что в большинстве случаев вы можете создать специальный api-ключ в приложении и включить эту информацию в приложение клиента, которая работает вроде как токен, и нет необходимости запрашивать новый токен с сервера ,

Как это работает или как мне создать доверенные ключи приложений для моего спокойного сервиса?

ответ

0

Использование JWT отлично, на самом деле я использую его сам. Но способ, которым вы его используете в своем примере, не очень безопасен. JWT не зашифрованы, а скорее закодированы. Если вы отправляете этот токен кому-то и включаете конфиденциальную информацию, такую ​​как superSecret, любой, кто имеет доступ к токену, сможет декодировать это.

Более чистая идея - прикрепить этот токен к объекту сеанса. Если вы используете Node.js и Express, вы можете использовать библиотеку express-session. Это прикрепляет объект сеанса к каждому запросу. После аутентификации пользователя вы можете назначить этот токен объекту сеанса и сохранить его либо в базе данных, либо в памяти, например redis. Для дополнительного уровня безопасности вы можете создать api-key для каждого доверенного приложения и сохранить его в своей базе данных. api-key может быть передан как заголовок.

Для настройки сеансов с экспресс, но я предлагаю вам прочитать на других вариантов и способов настроить это к вашим потребностям:

var session = require("express-session"); 
app.use(session({ 
     secret: /* Your secret. */, 
     store: /* Your redis store object. */, 
     client: /* Your redis client object. */, 
     resave: false, 
     saveUninitialized: false 
})); 

Чтобы крепят access-token пользователю при входе в систему (например) :

router.post("/login", function(request, response){ 

    /* Do all user validation here */ 

    request.session.token = jwt.sign({ 
      /* User info to store in session. */ 
    }, "superSecret"); 

    return response.redirect(/* Dashboard */); 

}); 

, как вы бы проверить подлинность пользователя, то будет:

  1. Validate что действителен api-key.
  2. Проверить if(!user.session){ // Route to login page. }
  3. Проверить if(!user.session.token){ // Not authorized. }
  4. Validate user.session.token
  5. Использование учетных данных внутри маркера (не ставить пароли пользователей в здесь), проверить, что пользователь является действительным пользователем в вашей системе - при условии, что они зарегистрировали учетную запись на своем веб-сайте/платформе. Вы можете, например, хранить уровни разрешений и userIds с адресом электронной почты или тем, что вы использовали бы для проверки.

Надеюсь, это поможет! Это займет некоторое время, чтобы обернуть ваши проверки подлинности.

+0

да, это помогло мне немного.попытается выполнить аутентификацию api без пользовательской части, чтобы вы могли потреблять api в приложении, но каждый пользователь этого приложения имеет к ней доступ. –

+0

Помните, что вы хотите, чтобы пользователь вошел в систему до того, как он обратится к API, иначе кто-либо из внешний мог бы использовать Postman, например, и получить доступ к конечным точкам. – nickcorin

+0

, но зачем идти за токенами, если вы храните их на сервере? Если вы это сделаете, вы можете просто использовать файлы cookie сеанса. И я уверен, что вы можете декодировать полезную нагрузку своих токенов, но вы не можете получить «сверхсекрет» из нее. Это отличная статья, чтобы лучше понять маркеры: https://auth0.com/blog/ten-things-you- должны-ноу-о-токены и-печенье / –