暗号化と復号化
フォームにユーザー名とパスワードを入力し、POSTリクエストを介してサーバに送信し、サーバ、ユーザ名とパスワードからなり、新しいユーザーを登録するときに第1の記憶状態コードとサービスのエンドユーザー名を紹介し、我々は現在の終わりを知っていますctx.request.bodyうちに、データベーステーブルに格納されています。このテーブルには、通常のユーザーという名前になります。
キーは、サーバーがデータベースへのユーザー名とパスワードを保存する方法です。ダイレクト預金?インポッシブルので、あまりにも危険な、危険な状況が表に掃引すべてのユーザー名とパスワードを発生することはありません。
したがって、より良い方法は、ユーザーのパスワード塩を暗号化するために、最初のサーバープロセスであり、その後、データベースに保存されました。
そのパスワード認証それ?正しい場合は、対応するデータベースの暗号化パスワードと比較するために、フロントエンド入力平文のパスワードを受信している、それはログインが成功したことを意味しています。注意:誰かが出た場合、この暗号化されたパスワードは無用です。なぜなら死者の善悪のアライメントの方法サーバー上に書かれているが、唯一の平文のパスワードと暗号化パスワードと比較することができます一致しています。同じ2は、暗号化されたパスワードを受信した場合、認証が渡されていません。
平文のパスワードと暗号化パスワードよりも、心配しないでください方法については、生産の暗号化と復号化の方法が一緒にペアリングされています。bcryptjsは、暗号化と復号化のために、このような優れたツールです。(インストールは、Windows上でbcryptのを文句を言う、何の問題は、他のシステムに言っていないので、代わりにbcryptjsをインストールし、そのAPIとまったく同じ方法やbcryptのを使用しますので)
私は、JSモジュール内の2つのメソッド、暗号化、復号化を定義します。暗号化アルゴリズムでは、まず私たちは、塩が最初にプレーンテキストのパスワードのランダムな文字の数と混合されると呼ばれる塩を生成する必要があります。数を大きく着信、より複雑な混合塩を表します。最後に、暗号化されたパスワードhashSync方法とリターンを生成します。復号化方法は、さらにシンプルで、直接法では、プレーンテキストのパスワードと暗号化パスワード比較にパッケージcompareSyncを呼び出します。
ユーザー登録
サーバモジュールルーティング登録情報、暗号化され、データベースに格納されているパスワード塩のフロントエンドを受信するためのレジスタインタフェースを露出させます。
const router = require("koa-router")(); const UserModel = require("../schema/user"); const Crypt = require("./crypt"); const jwt = require("jsonwebtoken"); // 新增一名用户 router.post("/register", async ctx => { const UserEntity = new UserModel(ctx.request.body); UserEntity.password = Crypt.encrypt(UserEntity.password); await UserEntity.save() .then(() => { ctx.body = { code: 200, msg: "register successfuly" }; }) .catch(() => { ctx.body = { code: 500, msg: "register failed" }; }); });
(看一下我这段代码,有几个需要说明的地方:第一,我是通过userModel这一个模型的save方法将这条数据存入mongoDB数据库中,至于model、schema的概念问题,先不在这里赘述;第二:存储失败的原因可能是网络问题,服务端程序出错,但最大的可能还是因为我在userSchema里定义了用户名的不可重复性,也就是所谓的“该用户名已存在”)。
为了阐述方便,这里将userModel的定义代码贴出来:
登录校验
让我们回到服务端路由模块,看下怎样去完成一个登录校验。
// 登录校验 router.post("/login", async ctx => { const data = ctx.request.body; await UserModel.findOne({ account: data.account }) .then(res => { const checkPassword = Crypt.decrypt(data.password, res.password); if (checkPassword) { const token = jwt.sign({ account: res.account }, "zhangnan", { expiresIn: "2h" }); ctx.body = { code: 200, msg: "successfuly login", token: token }; } else { ctx.body = { code: 500, msg: "wrong password" }; } }) .catch(() => { ctx.body = { code: 501, msg: "user does not exist" }; }); });
首先,我们根据用户输入的用户名去数据库查找用户信息,如果查不到,说明用户名不存在,这是第一层逻辑。
如果查到了,则调用刚刚定义好的解密方法进行明文密码与加密密码比对,如错误,则告诉前端密码错误;如正确,则调用jwt的sign方法签发一个token给前端。签发的内容是用户名;后面前端再发来请求并携带这个token时,如果验证到token有效,那解析出来的用户名就是服务器判断前端请求身份的标识,它告诉服务器“我是xxx,且我处于已登录状态”。这是第二层逻辑。