第三方认证中心跳转

一、业务需求

由第三方认证中心将 token 放在 header 中跳转系统,前端获取到第三方系统携带 header 中的 token。

二、 业务流程

模拟第三方应用

  • CUSTOM-USERTOKEN 是第三方的 token
  • proxy_pass 是我们的前端地址
nginx 复制代码
  server {
    listen 12345;
    server_name localhost;

    location / {
      proxy_set_header Host $host:$server_port;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Real-Port $remote_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header CUSTOM-USERTOKEN 'MY-TOKEN'
      proxy_pass http://127.0.0.1;
    }
  }

前端静态代理

  • backend 是后端服务地址
  • 80 是前端代理端口
nginx 复制代码
  server {
    listen 80;
    server_name localhost;

    location / {
      root /vuepress/docs;
      index index.html;
      try_files $uri $uri/ /index.html;
    }
    error_page 405 =200 $uri;
  }

三、处理方式

由于放在 header 中的内容,前端只有从 XHR 请求中才能拿到,所以直接打开页面时,肯定是无法拿到 header 中的 token 的,又因为这个 token 只有从第三方系统中跳转才能携带,所以也无法通过请求当前页面去获取 header 中的内容。

一、通过后端重定向

在 nginx 代理中,第三方请求从原本跳转访问前端的地址==改为==后端地址, 因为后端是可以从请求总直接拿到 header,所以这时由后端去处理 token ,在重定向到前端。

  • 后端可以设置 cookie,前端从 cookie 中获取
  • 后端可以拼接 URL, 前端从 url 中获取
  • 后端可以通过缓存 cookie, 重定向到前端后发请求获取 token

模拟第三方应用

  • 第三方应用由跳转前端改为跳转后端接口
nginx 复制代码
  server {
    listen 12345;
    server_name localhost;

    location / {
      proxy_set_header Host $host:$server_port;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Real-Port $remote_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header CUSTOM-USERTOKEN 'MY-TOKEN'
      proxy_pass http://backend/token;
    }
  }

前端静态代理

  • 前端代理不需要做任何处理
nginx 复制代码
  server {
    listen 80;
    server_name localhost;

    location / {
      root /vuepress/docs;
      index index.html;
      try_files $uri $uri/ /index.html;
    }
    error_page 405 =200 $uri;
  }

二、通过 nginx 重定向 URL

在 nginx 代理中,新增一个 /token 的代理地址,用于转发地址,第三方请求 从原本跳转访问前端的地址,改为 /token 代理地址 因为 nginx 中是可以获取 header 中的内容的,所以这时由 /token 处理拼接好 url ,在重定向到前端。

模拟第三方应用

  • 第三方应用访问路径改为 http://127.0.0.1/token
nginx 复制代码
  server {
    listen 12345;
    server_name localhost;

    location / {
      proxy_set_header Host $host:$server_port;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Real-Port $remote_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header CUSTOM-USERTOKEN 'MY-TOKEN'
      proxy_pass http://127.0.0.1/token;
    }
  }

前端静态代理

  • 新增 /token 代理,进行拼接 URL 后跳转
nginx 复制代码
  server {
    listen 80;
    server_name localhost;

    location / {
      root /vuepress/docs;
      index index.html;
      try_files $uri $uri/ /index.html;
    }
    location /token {
      # 将 $http_custom_usertoken 拼接在 URL 中,同时重定向到前端
      # 前端通过 location.search 处理 token
      rewrite (.+) http://127.0.0.1?token=$http_custom_usertoken;
    }
    error_page 405 =200 $uri;
  }

由于通过响应头中设置 Set-Cookie 可以直接存储到浏览器中,所以我们也可以通过直接设置 cookie 的方式处理。

模拟第三方应用

  • 此时第三方应用直接访问前端即可
nginx 复制代码
  server {
    listen 12345;
    server_name localhost;

    location / {
      proxy_set_header Host $host:$server_port;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Real-Port $remote_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header CUSTOM-USERTOKEN 'MY-TOKEN'
      proxy_pass http://127.0.0.1;
    }
  }

前端静态代理

  • token 设置在 cookie
nginx 复制代码
  server {
    listen 80;
    server_name localhost;

    location / {
      add_header Set-Cookie "token=$http_custom_usertoken;HttpOnly;Secure";
      root /vuepress/docs;
      index index.html;
      try_files $uri $uri/ /index.html;
    }
    error_page 405 =200 $uri;
  }

方法 [三、通过 nginx 设置 Cookie](#三、通过 nginx 设置 Cookie "#%E4%B8%89%E3%80%81%E9%80%9A%E8%BF%87%20nginx%20%E8%AE%BE%E7%BD%AE%20Cookie") 中,存在一个问题,由于此时在前端静态代理上添加 cookie,这就会导致所有静态资源都会携带 cookie, 这就会造成 cookie 中因为 path 不同而重复添加, 所以我们还可以通过造一层代理的方式处理这个问题

模拟第三方应用

  • 代理地址再次修改为 token
nginx 复制代码
  server {
    listen 12345;
    server_name localhost;

    location / {
      proxy_set_header Host $host:$server_port;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Real-Port $remote_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header CUSTOM-USERTOKEN 'MY-TOKEN'
      proxy_pass http://127.0.0.1/token;
    }
  }

前端静态代理

  • token 设置在 /token 代理地址的 cookie
  • /token 重定向到前端地址
nginx 复制代码
  server {
    listen 80;
    server_name localhost;
	
    location / {
      root /vuepress/docs;
      index index.html;
      try_files $uri $uri/ /index.html;
    }
    
    location /token {
      add_header Set-Cookie "token=$http_custom_usertoken;HttpOnly;Secure";
      rewrite (.+) http://127.0.0.1;
    }
    error_page 405 =200 $uri;
  }
相关推荐
有梦想的刺儿9 分钟前
webWorker基本用法
前端·javascript·vue.js
cy玩具29 分钟前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
苹果醋338 分钟前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
qq_390161771 小时前
防抖函数--应用场景及示例
前端·javascript
雨雪飘零2 小时前
Windows系统使用OpenSSL生成自签名证书
nginx·证书·openssl
John.liu_Test2 小时前
js下载excel示例demo
前端·javascript·excel
Yaml42 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理