使用nginx的auth_request模块完成静态文件的跨域(子域名)鉴权认证
一、域名设置
分为两个域名
前端:front.host.abc(静态网站,需要鉴权后才能访问)
后端:auth.host.abc(用于提供鉴权和登录页面)
二、nginx配置
后端按照常规配置即可,前端关键配置如下:
server {
listen 80;
server_name front.host.abc;
root "var/html/www/front.host.abc";
location / {
index index.php index.html;
autoindex off;
auth_request /auth-proxy;
# Access-Control-Allow-Credentials 必须指定 Access-Control-Allow-Origin 而不能为*
add_header Access-Control-Allow-Origin "$http_origin" always;
add_header Access-Control-Allow-Credentials 'true' always; # 将客户端的cookie转发给鉴权服务端
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS, PUT' always;
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,token' always;
if ($request_method = 'OPTIONS') {
return 204;
}
}
location /auth-proxy {
internal;
proxy_pass http://auth.host.abc/auth.php; # 鉴权地址
proxy_set_header X-Original-URI $request_uri; # 给鉴权服务器带上访问的uri,判断路径权限使用
proxy_set_header X-Request-Method $request_method; #请求的方法名
proxy_pass_request_body off; # 不转发body给鉴权
proxy_set_header Content-Length ""; # 不转发body给鉴权
expires 30s;
}
error_page 401 = @error401;
location @error401 {
return 302 http://auth.host.abc/login.php; # 登录地址
}
}
三、代码示例
前端为静态网站,后端auth.php和login.php示例如下:
1、auth.php
<?php
$k = isset($_COOKIE["sesskey"])?$_COOKIE["sesskey"]:"";
if(!empty($k) && ($k == "sess_fasfs421fa4231fsa342"))
http_response_code(200);
else
http_response_code(401);
?>
2、login.php
<form action="" method="post">
<input type="hidden" name="act" value="ok">
<input type="submit" value="登录">
</form>
<?php
if($_POST["act"] == "ok") {
setcookie("sesskey", 'sess_fasfs421fa4231fsa342', time()+3600, "/", "host.abc");
header('Location:http://front.host.abc');
}
?>