2016-10-12 9 views
0

私は残りのAPIを認証で保護しようとしているので、信頼できるアプリケーションだけがこのAPIを消費する可能性があります。私はベストプラクティスとガイドを探していましたが、現実の例で実際にそのことを説明している人はいません。残りのAPIをjwtで保護する

私はこれに似jsonwebtoken認証作成:これは私がその後、APIへのすべての要求を渡すことができ、トークンを返す、[OK]を動作しますが、どのように私はアプリはそのトークンや用途を見出す作るん

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-keyを生成してその情報をクライアントのアプリに含めてトークンのように動作させることができ、サーバーから新しいトークンをリクエストする必要はありません。

私は安心してサービスを提供するために、どのように動作しますか、または信頼できるアプリケーションキーを作成するにはどうすればよいですか?

答えて

0

JWTを使用すると問題はありませんが、実際には自分で使っています。しかし、あなたの例でそれを使用している方法はあまり安全ではありません。 JWTは暗号化されておらず、エンコードされているだけです。このトークンを誰かに送り、superSecretなどの機密情報を含む場合、トークンにアクセスできる人は誰でもこれを解読できます。

このトークンをセッションオブジェクトに添付することを賢明に考えます。 Node.jsとExpressを使用している場合は、express-sessionライブラリを使用できます。これにより、各要求にセッションオブジェクトが付加されます。ユーザが認証されると、このトークンをセッションオブジェクトに割り当てて、redisなどのデータベースまたはメモリストアに格納することができます。セキュリティの追加レイヤーの場合は、信頼できる各アプリケーションに対してapi-keyを生成し、それをデータベースに格納することができます。 api-keyはヘッダーとして渡すことができます。 (たとえば)ログイン時にユーザーにaccess-tokenを添付するには

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 
})); 

:エクスプレスとのセッションを設定するには、私はあなたが他のオプションとあなたのニーズにこれを設定する方法をよく読んでお勧めします

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. 検証api-keyが有効であること。トークン内の資格情報を使用して
  2. チェックif(!user.session){ // Route to login page. }
  3. チェックif(!user.session.token){ // Not authorized. }
  4. 検証user.session.token
  5. (ここでは、ユーザーのパスワードを入れないでください)、ユーザーがシステムで有効なユーザーであることを検証する - と仮定し、それらあなたのウェブサイト/プラットフォームにアカウントを登録しました。たとえば、許可レベルとuserIdを電子メールアドレスなどで保存することができます。

こちらがお役に立てば幸いです。あなたの頭の認証の習慣を包むのにしばらく時間がかかります。

+0

はい、これは私を少し助けました。ユーザーパートなしでAPI認証を行うようにします。アプリ内でAPIを使用できますが、そのアプリケーションのすべてのユーザーはAPIにアクセスできます。 –

+0

APIにアクセスする前にログインする必要があります。例えば、外ではPostmanを使用してエンドポイントにアクセスすることができます。 – nickcorin

+0

しかし、もしあなたがサーバー側にトークンを保管したらどうしてトークンに行くのですか?そうした場合、セッションクッキーを使うことができます。そしてあなたのトークンのペイロードをデコードできるとはかなり確信していますが、あなたはそれから「スーパークレジット」を得ることはできません。これはトークンをより良く理解する素晴らしい記事です:https://auth0.com/blog/ten-things-you-知っておくべきこと - トークンとクッキー/ –

関連する問題