# Chap6 认证

# 简介

  • Nginx可以认证用户,避免未授权用户访问应用服务器
  • 开源版本提供basic认证,和 authentication subrequests
  • 商业版提供JWT认证和第三方OpenID授权集成

# HTTP Basic Authentication

  • 生成一个文件,内容如下
# comment
name1:password1 # 密码要求加密过或者哈希过
name2:password2:comment
name3:password3
  • 使用命令行加密密码原文openssl passwd MyPassword,得到密文,写入文件 ;Apache的htpasswd命令使用apr1算法加密,也能被Nginx识别
# 启用basic认证
location / {
  auth_basic "Private site"; # 用户到达页面时弹出的标题
  auth_basic_user_file conf.d/passwd; # 用户账户和密码文件的路径
}
  • basic authentication 不能替代web应用的用户认证,网络传输请求头Authorization中,传的是Basic和username:password的base64编码,建议用https协议传输,会安全一点

# Authentication Subrequests

  • 第三方认证,使用http_auth_request_module 来向认证服务发送请求,核实身份后再处理下一步请求
  • 要访问/private,就要先访问/auth,若返回200,才允许接着访问/private/,
location /private/ {
  auth_request /auth;
  auth_request_set $auth_status $upstream_status; # 设置基于子请求结果的变量值
}

location = /auth {
  internal;
  proxy_pass http://auth-server;
  proxy_pass_request_body off;
  proxy_set_header Content-Length "";
  proxy_set_header X-Original-URI $request_uri;
}

# Validating JWTs

  • Nginx Plus提供JWT支持
location /api/ {
  auth_jwt "api";
  auth_jwt_key_file conf/keys.json;
}

# 使用已有的OpenID 连接单点登录 认证用户

  • Nginx Plus 提供
  • OpenID1.0协议是在OAuth2.0协议之上添加了身份的jwt认证
location /private/ {
  auth_jwt "Google Oauth" token=$cookie_auth_token;
  auth_jwt_key_file /etc/nginx/google_certs.jwk;
}
  • 需要从Google拉取JSON Web Key来验证OpenID Connect Tokens
# crontab 文件中的一行,每小时通过请求来刷新一次key
0 * * * * root wget https://www.googleapis.com/oauth2/v3/certs-O /etc/nginx/google_certs.jwk
最后更新: 5/31/2022, 6:43:40 AM