markdown 挑战:19.1测试本地身份验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 挑战:19.1测试本地身份验证相关的知识,希望对你有一定的参考价值。

# Challenge - Testing Local Auth

In this challenge you will create a tests which verify the login process. 

## Create a Local Auth test

To test the login process, you first need to seed the database a user, then POST a username and password to the endpoint. The endpoint will return a JWT that you must verify using your JWT_SECRET.

To get started, create a `/test/login.test.js` file. And add the require packages and setup to the start of the file.

```js
const app = require('../server');
const chai = require('chai');
const chaiHttp = require('chai-http');
const mongoose = require('mongoose');
const jwt = require('jsonwebtoken');

const { TEST_MONGODB_URI, JWT_SECRET } = require('../config');

const User = require('../models/user');

const expect = chai.expect;
chai.use(chaiHttp);
```

Note the additional of the `JWT_SECRET`. You will need this to verify the JWT returned from the `/login` endpoint.

Next, you will create a describe block with Mocha `before`, `beforeEach`, `afterEach` and `after` hooks. And create `fullname`, `username` and `password` variables with sample data which you will insert in to the DB and use to validate the login process.

The code in the hooks should look familiar, except for the `beforeEach` hook which hashes the password before inserting the user into the database.

```js
describe.only('Noteful API - Login', function () {

  const fullname = 'Example User';
  const username = 'exampleUser';
  const password = 'password';

  before(function () {
    return mongoose.connect(TEST_MONGODB_URI)
      .then(() => mongoose.connection.db.dropDatabase());
  });

  beforeEach(function () {
    return User.hashPassword(password)
      .then(digest => User.create({ fullname, username, password: digest }));
  });


  afterEach(function () {
    return mongoose.connection.db.dropDatabase();
  });

  after(function () {
    return mongoose.disconnect();
  });

  // TESTS GO HERE
  
});
```


Add the following test to your file. 

The test POSTs the `username` and `password` to the endpoint. The endpoint should respond with a JWT which is then verified. Finally, the test compares the payload with the known user info. The payload should **not** contain a `password` property, and the `username` and `fullname` should match the example user.

```js
it('Should return a valid auth token', function () {
  return chai.request(app)
    .post('/api/login')
    .send({ username, password })
    .then(res => {
      expect(res).to.have.status(200);
      expect(res.body).to.be.an('object');
      expect(res.body.authToken).to.be.a('string');

      const payload = jwt.verify(res.body.authToken, JWT_SECRET);

      expect(payload.user).to.not.have.property('password');
      expect(payload.user.username).to.equal(username);
      expect(payload.user.fullname).to.equal(fullname);
    });
});
```

Now that you have a tested the positive a.k.a. "happy path" case, you need to test the negative (aka sad path), your challenge is to create tests for the negative a.k.a. "sad path" scenarios

```js
  it('Should reject requests with no credentials');
  it('Should reject requests with incorrect usernames');
  it('Should reject requests with incorrect passwords');
```

Finally, we're going to test the `/api/refresh` endpoint. Here you'll need to create a JWT and add it to the Authorization header as part of the request. 

Add another `describe` block with the following code:

```js
  describe('/api/refresh', function () {

    it('should return a valid auth token with a newer expiry date', function () {
      const user = { username, fullname };
      const token = jwt.sign({ user }, JWT_SECRET, { subject: username, expiresIn: '1m' });
      const decoded = jwt.decode(token);

      return chai.request(app)
        .post('/api/refresh')
        .set('Authorization', `Bearer ${token}`)
        .then(res => {
          expect(res).to.have.status(200);
          expect(res.body).to.been.a('object');
          const authToken = res.body.authToken;
          expect(authToken).to.be.a('string');

          const payload = jwt.verify(authToken, JWT_SECRET);
          expect(payload.user).to.deep.equal({ username, fullname });
          expect(payload.exp).to.be.greaterThan(decoded.exp);
        });
    });
    
  });
```

Just like the `/login` tests, now that you have a tested the positive a.k.a. "happy path" case, your challenge is to create tests for the negative a.k.a. "sad path" scenarios

```js
it('should reject requests with no credentials');
it('should reject requests with an invalid token');
it('should reject requests with an expired token');
```



以上是关于markdown 挑战:19.1测试本地身份验证的主要内容,如果未能解决你的问题,请参考以下文章

markdown 挑战16:本地认证

身份验证挑战

Twitter4J + Android:身份验证挑战为空异常

本地主机上的 Firebase Facebook 身份验证

从未调用过 Swift 身份验证挑战 URLSession

markdown 挑战10:Knex JS测试