-1

无法理解 nodejs 身份验证(KoaJS2)。

我有这段代码:

router.post("/login", koaBody, (ctx, next) => {
  const data = ctx.request.body;
  db
    .any("SELECT * FROM users ORDER BY id ASC")
    .then(function(data) {

      token = jwt.sign(data, token_secret, {
        expiresIn: "24h" // expires in 24 hours
      });

      console.log(ctx.request.header);
      // ctx.set("token", `test`);
    })
    .catch(function(error) {
      // error;
    });

我签名后令牌存储在哪里?

没有“身份验证”标头...

4

1 回答 1

0

服务器端,您接近正确的事情。您需要做的:将令牌返回给客户端:

router.post("/login", koaBody, (ctx, next) => {
  const data = ctx.request.body;

  // ...
  // extract username and password from body
  // ...

  db
    .any("SELECT * FROM users ORDER BY id ASC") // here using and checking credentials is also missing ;-)
    .then(function(data) {

      // create the token
      token = jwt.sign(data, token_secret, {
        expiresIn: "24h" // expires in 24 hours
      });

      // now you have to pass it back to the client
      // the token is NOT stored on the server side!
      ctx.body = { 'token': token }
    })
    .catch(function(error) {
      // error;
    });

客户端-如果您在正文中取回令牌-您将其存储在例如本地存储中

我在客户端使用 Angular 2,这里的代码(客户端登录服务)可能如下所示:

login(credentials) {

    const headers = new Headers();
    headers.append('Content-Type', 'application/json');
    headers.append('Accept', 'application/json');
    const reqopt: RequestOptions = new RequestOptions({
      headers: headers
    });

    // credentials: username, password -- 
    return this.http.post(...your_api_endpoint_ + '/login', credentials, reqopt)
      .map(res => {
        const data = res.json();
        if (data && data.token) {
          localStorage.setItem('token', data.token); // <--- here you store your token
        }
      });
}

每次您现在再次访问您的 API 时,请不要忘记在标头中为您提供令牌并在服务器端 ( JWT.verify()) 进行检查。

在这里您可以找到更一般的 JWT 介绍: https ://medium.com/vandium-software/5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec

希望有帮助。

于 2017-06-19T12:53:31.637 回答