Nodejs vue 前后端分离 如何实现微信后端授权

发布于 1周前 作者 songsunli 来自 nodejs/Nestjs

Nodejs vue 前后端分离 如何实现微信后端授权
前端授权会多次跳转,用户体验不佳。。。

20 回复

难道不是在服务器端把 token 存起来,请求时候验证授权么?


前端获取 code 发给后端 后端请求微信服务器获取用户信息 登陆/注册 返回 token。

还没拿到 token 之前的授权登陆。在微信端用户同意授权,获取 code 传给后台,后台通过 code 换取网页授权 access_token,最后拿到用户 openid,openid 换系统的 token 返回给前端;

我先去试试

code 换 openid 的过程一律由后端包办了就完了啊,并不需要多次前端往复。
自己看文档,时序图里仅一次用户请求。https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

授权和前端没啥关系,都是后端发请求的;
前端不会获取任何东西,不会发给后端任何东西

在前端拿 code 的话,网页授权域名就要用前端的域名,如果我想多个应用公用的话就不行了吧?我现在都是在后端做,后端获取到 openid 后再生成 jwt token 再重定向回前端。但是这样重定向回前端的 url 就带了 token,用户复制链接到别的地方就能通过身份验证~有没有好点的解决办法呢

我看大部分的解决方法是, open 一个新窗口做授权,然后在这个窗口授权完之后, 把 token 传给 parentwindow,就是前端的这个窗口。

会跳转到一个页面做授权处理然后后端再跳转回之前的即将转向的地址

的确不佳,但也找不到啥更好的方法啊。

解决方法是这样的,前端用户点击我要用微信登录按钮->此时请求应用 API 接口,我们叫他小张把,小张做啥呢?就是给你生成跳转收到微信的 URL,然后,前端拿到 url 后 location.href=xxxx 进行跳转,然后微信跳转回来后不是带了 code 么?你现在应该卡在 code 这儿了吧,该怎么做呢?记得生成小张这个接口么?前端请求小张的时候啊,小张需要让你带上一个叫做 redirect_uri 或者其他名字的参数,这个参数就是微信跳转回来跳转的接口,然后,你的页面就拿到了 code 了,这个时候,让写接口的哥们儿给你写一个叫做小王的接口,小王做什么呢?小王就等你拿 code,他去根据 code 获取你们这边的用户信息,如果没有,他可以无私地自动创建一个,也可以告诉你用户没有在系统中注册,你手动告诉用户进行注册或者绑定你们的账号,完了

好了,说下小张这个接口,这个接入我们可以让他变得更牛逼点,做啥呢?小张接收我们应用的 redirect_uri,然后小张生成跳转微信的 uri 的时候优雅一点,假设我们应用的 hostname 是 baidusb.cn ,前端想要收到 code 的 url 是 baidusb.com/wechat/code,之前说的是让微信直接跳转 baidusb.com/wechat/code,现在不这样做了,让我们应用来跳转,比如我们的应用也就是服务端的小伙伴写了一个固定的接口叫做 api.baidusb.com/wechat/code/callback,微信先跳这个 URL,然后这里做 code 和 state 校验,完事儿了之后再跳到 baidusb.com/wechat/code 这儿来,baidusb.com/wechat/code,这样很多个子应用都可以用啦,当然,这只是其中一种比较好的办法,仅供参考

可以在公众号入口跳转的时候申请授权,前端拿到 code 之后发送给后台,后台请求到 token

如果不用获取用户地理信息之类的数据可以静默授权,不需要用户确认。直接在后台请求就好了

防止楼主踩坑,可以看看这篇文章 https://segmentfault.com/a/1190000010753247

对的,就是这种方法。但是第 4 步返回如何处理

获取微信 openid 都需要服务器端接口来完成,而跳转在 vue 使用 window.location.href="/access",来完成; vue 端只需要获取到服务器传回的 openid 或者其他值来保存到本地,是否授权都是服务器来进行判断的

我打算让获取 code 的 window.location.href 里 redirect_uri 指向服务器后台,不再重定向到前台(而前端直接进入 index ),后台处理完成返回 token 到前端,这样减少一次前端重定向

如果后台能完成重定向那当然甚好,不过我们之前处理过,貌似不太好操作,遂放弃,希望你能成功!

在实现Node.js与Vue前后端分离项目中的微信后端授权时,你可以按照以下步骤进行:

  1. 前端(Vue)部分
    • 使用微信提供的JS-SDK进行登录,获取用户的临时登录凭证(code)。
    • 将code发送到后端进行进一步处理。
// 假设你使用的是axios进行HTTP请求
axios.post('/api/wechat/login', { code: tempCode })
  .then(response => {
    // 处理后端返回的登录信息,如token
  })
  .catch(error => {
    console.error('微信登录失败', error);
  });
  1. 后端(Node.js)部分
    • 接收前端传来的code。
    • 使用code向微信服务器请求用户的openid和session_key。
    • 根据openid生成或查询用户信息,并生成JWT(或其他形式的token)返回给前端。
const axios = require('axios');

app.post('/api/wechat/login', async (req, res) => {
  const { code } = req.body;
  const appId = 'YOUR_APP_ID';
  const secret = 'YOUR_APP_SECRET';
  
  const response = await axios.get(`https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${code}&grant_type=authorization_code`);
  
  const { openid, session_key } = response.data;
  
  // 生成token并返回给前端
  const token = jwt.sign({ openid }, 'YOUR_SECRET_KEY', { expiresIn: '1h' });
  res.json({ token });
});

确保你已经安装了必要的依赖,如axiosjsonwebtoken,并配置好微信开发者平台的相关信息。

回到顶部