随着技术的发展, 我们的前端页面采用https协议传输, 这是几乎是必然的.
将来的网页甚至可能强制使用https(苹果已经开始这样做了)
因此后端暴露的API接口也应该使用https. 否则有些浏览器会报出协议不一致的错误.net::ERR_SSL_PROTOCOL_ERROR错误
解决这个问题最佳的方法是: 我们的koa2后端应用程序暴露https协议API接口,前端直接发送https头的请求
一. 安装https、koa-sslify、fs库
npm i -S https fs koa-sslify
koa-sslify
koa-sslify是实施HTTPS中间件, 可对任何传入请求强制实施HTTPS连接。
在未加密的HTTP请求的情况下,koa-sslify会使用301 permanent redirect (或可选地307 Temporary Redirect)自动重定向到HTTPS地址。
二. 使用koa-sslify强制使用https
在app.js中引入koa-sslify并使用
const sslify = require('koa-sslify').default
app.use(sslify())
三. 配置SSL证书
我们下载下来的SSL证书中,存在一套通用的key/pem文件,我们使用它们就可以
我们使用FTP工具把它们上传至后端项目中: 这里我新建了一个ssl文件夹专门存放这些文件
四. 创建https监听服务, 实现https协议的加密/解密访问
在 ./bin/www配置文件中,引入https库和fs库
var fs = require('fs');
const https = require('https')
设置配置选项
const options = {
key: fs.readFileSync('ssl/xxxxyun.com.key'),
cert: fs.readFileSync('ssl/xxxxyun.com.pem'),
}
创建https服务
https.createServer(options, app.callback()).listen(3001, (err) => {
if (err) {
console.log('server error: ', err);
} else {
console.log('server at' + 3001);
}
});
现在, 我们再使用https获取koa2 API就已经成功了😊
此外,由于koa-sslify强制使用https访问, 之前默认的3000端口没用了, 直接吧3000端口改为https吧.
附: 最终的bin/www
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('demo:server');
var http = require('http');
var fs = require('fs');
// 引入https
const https = require('https')
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
// app.set('port', port);
/**
* Create HTTP server.
*/
// var server = http.createServer(app.callback());
/**
* Listen on provided port, on all network interfaces.
*/
// server.listen(port);
// server.on('error', onError);
// server.on('listening', onListening);
const options = {
key: fs.readFileSync('ssl/xxxxyun.com.key'),
cert: fs.readFileSync('ssl/xxxxyun.com.pem'),
}
var httpsserver = https.createServer(options, app.callback())
httpsserver.listen(port, (err) => {
if (err) {
console.log('server init error', err);
} else {
console.log('server running at port :' + port);
}
});
httpsserver.on('error', onError);
httpsserver.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTPs server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTPs server "listening" event.
*/
function onListening() {
var addr = httpsserver.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}