智障家居初战-对接篇

本篇主要讲解与天猫精灵服务器的认证对接:将会在VPS上安装nginx做反向代理,并申请SSL证书以便启用https功能;同时,在本地服务器上部署oauth认证服务,满足与天猫精灵服务器对接的认证需要。


1.VPS部分

1.1nginx反向代理

①安装nginx

1)#apt-get install nginx

会有提示是否安装,按y继续即可

2)在浏览器测试一下访问域名或者IP,看到这个界面已经正常安装

3)#vi /etc/nginx/sites-enabled/default
编辑配置文件

4)代理https访问家用服务器
配置文件末位加入,依然注意修改对应的域名以及IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 443;
server_name www.example.com; #填写绑定证书的域名
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://10.8.0.2;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect http:// $scheme://; #做https跳转
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

5)代理http访问家用服务器(可省略)

如果想做80的代理,可以如下进行设置。配置文件已经有80 http服务器的设置了,修改server _name、location的内容。

i修改前

ii修改后

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name www.example.com;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
proxy_pass http://10.8.0.2;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

1.2.申请SSL证书

我们申请Let’s Encrypt的SSL证书,有自动化申请脚本,虽然有效期只有90天,不过到期我们再执行一下一次脚本就行了。

1)#git clone https://github.com/letsencrypt/letsencrypt
下载

Tips:要注意一下当前的安装目录,#pwd可以查看,后续还需要到该目录执行一遍命令来给证书延期

2)#cd cd letsencrypt

进入letsencrpt目录

3)#./letsencrypt-auto -d example.com -d www.example.com

example.com换成你自己的域名

4)脚本执行完后,会在/etc/letsencrypt/live/目录下生成一个example.com命名的目录,里面有相应的证书文件了

Tips:注意检查证书的目录是否与配置enginx设置的证书目录一致

5)#/etc/init.d/nginx reload
重启nginx,正常运行如下

Tips:如有错误提示可以#tail /var/log/syslog查看系统日志看错误原因

2.家用服务器

2.1.启用https

1)#a2enmod ssl

启用apache2的ssl配置

Tips:这条命令相当于
sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled
sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled

2)#ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled

加入ssl站点的配置

Tips:Ubuntu安装LAMP套件,apache2已自带证书了,default-ssl.conf里面也设置好,直接就可以使用。也可以自己用openssl重新生成自签证书,在default-ssl.conf设置新生成的证书。

3)#service apache2 restart

重启生效。

4)这时,在浏览器使用https://www.你的域名 进行访问,可以看到apache2的页面,说明已经成功访问到家用服务器了。

2.2.oauth认证服服务

oauth认证流程如下,我们将会使用三个php来实现相关功能:server.php(oauth服务器配置,为后面两个php提供环境)、authorize.php(认证页面,A、B、C步骤)、token.php(认证client,生成toke,D步骤n)。

①下载oauth2
1)#cd /var/www

准备把oauth2安装到该目录

Tips:看别的教程是放在/var/www/html,该目录外部可以访问,感觉会有风险

2)#git clone https://github.com/bshaffer/oauth2-server-php.git -b master

下载oauth2基础环境包

②配置数据库

1)#mysql -u root -p

会要求输入密码,这个是在安装Ubuntu时候有要求设置的

2)>create database oauth;

创建一个名为oauth的数据库

3)>use oauth;

进入数据库

4)建表,直接复制运行以下代码即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
CREATE TABLE oauth_clients (
client_id VARCHAR(80) NOT NULL,
client_secret VARCHAR(80),
redirect_uri VARCHAR(2000),
grant_types VARCHAR(80),
scope VARCHAR(4000),
user_id VARCHAR(80),
PRIMARY KEY (client_id)
);
CREATE TABLE oauth_access_tokens (
access_token VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(80),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
PRIMARY KEY (access_token)
);
CREATE TABLE oauth_authorization_codes (
authorization_code VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(80),
redirect_uri VARCHAR(2000),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
id_token VARCHAR(1000),
PRIMARY KEY (authorization_code)
);
CREATE TABLE oauth_refresh_tokens (
refresh_token VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(80),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
PRIMARY KEY (refresh_token)
);
CREATE TABLE oauth_users (
username VARCHAR(80),
password VARCHAR(80),
first_name VARCHAR(80),
last_name VARCHAR(80),
email VARCHAR(80),
email_verified BOOLEAN,
scope VARCHAR(4000),
PRIMARY KEY (username)
);
CREATE TABLE oauth_scopes (
scope VARCHAR(80) NOT NULL,
is_default BOOLEAN,
PRIMARY KEY (scope)
);
CREATE TABLE oauth_jwt (
client_id VARCHAR(80) NOT NULL,
subject VARCHAR(80),
public_key VARCHAR(2000) NOT NULL
);

5)>show tables;

检查一下是否成功建表

6)>INSERT INTO oauth_clients (client_id, client_secret, redirect_uri) VALUES("smzdm","smzdm","https://open.bot.tmall.com/oauth/callback");

插入一条认证客户端需记录,我这id和密码都是smzdm。记住这个,迟点会在天猫精灵开发者平台进行配置。

6)>grant all on oauth.* to 'oauth'@'localhost' identified by 'password';

创建一个oauth的用户,可以使用oauth数据库,本地登陆使用

7)>flush privileges;

使用户生效

8)>exit

退出mysql

③新建php页面

1)#cd /var/www/html

进入网站根目录

2)#vi server.php

内容复制相应附件的内容即可,红圈地方是可能变化的地方

3)类似地创建好token.php、authorize.php

④天猫精灵开发者平台配置

1)打开网址https://open.bot.tmall.com/,右上角登陆平台

2)添加一个新技能

3)技能类型选智能家居,其它随便填,下一步

4)填写好保存,继续下一步

5)点击按钮开始测试,然后点账户配置

6)可以看到authorize.php的提示页面

Tips:在authorize.php里修改提示信息,随你喜欢改成中文

7)点击yes,有如下信息返回说明成功认证。

附1:下载

附2:参考文章传送门