微信H5页面的登录鉴权流程

29 阅读3分钟
  1. 引导用户进入授权页面

    • 前端通过构建一个授权URL,引导用户进入微信的授权页面。这个URL包含了小程序的appid、回调地址redirect_uri、作用域scope等参数。
  2. 用户同意授权,获取code

    • 用户在微信授权页面同意授权后,微信会重定向到指定的回调URL,并附带一个code参数,这个code是临时的授权凭证。
  3. 后端通过code换取网页授权access_token

    • 前端将获取到的code发送到后端服务器,后端使用这个code向微信服务器请求access_token和用户的openid。这一步是在服务器端完成的,以保护appsecret不被泄露。
  4. 如果需要,开发者可以刷新网页授权access_token,避免过期

    • access_token有有效期限制,如果需要可以刷新access_token以保持用户登录状态。
  5. 通过网页授权access_token和openid获取用户基本信息

    • 最后,使用获取到的access_tokenopenid,后端可以请求微信服务器获取用户的基本信息,如昵称、头像等。

在整个流程中,前端负责引导用户进入授权页面并接收code,后端负责使用code与微信服务器交互,获取access_token和用户信息。微信服务器则提供授权和用户信息的接口。

这个流程确保了用户信息的安全,因为用户敏感信息的获取完全在后端进行,前端只负责传递code,不直接接触用户的access_tokenopenid。这样的设计也符合微信官方的安全最佳实践

前端如何构建授权URL?

  1. 获取AppID和Redirect URI

    • 首先,您需要在微信公众平台注册应用并获取AppID。
    • 确定您的回调地址(Redirect URI),这是用户授权后微信将重定向回的地址。
  2. 构造授权URL

    • 使用以下格式构造授权URL,引导用户进入微信的授权页面:

      const getAuthUrl = (webUrl) => {
          let redirectUri = encodeURIComponent(`${SERVICE_URL}/wxBack?webUrl=${webUrl}`);
          return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_userinfo#wechat_redirect`;
      };
      
    • 在这个URL中,appid是您的应用ID,redirect_uri是您的回调地址(需要进行URL编码),response_type设置为code表示您希望获取授权码,scope表示授权范围,snsapi_userinfo表示需要获取用户信息。

  3. 前端页面重定向

    • 在前端页面中,当用户点击登录按钮时,使用window.location.href重定向到上面构造的授权URL:

      window.location.href = getAuthUrl(currentUrl);
      
    • 这里currentUrl是用户当前页面的URL,用于在授权结束后返回到原页面。

  4. 处理微信授权回调

    • 用户授权后,微信会重定向回您的回调地址,并附带code参数。您需要在服务器端接收这个code,并用它来换取access_token和用户信息。
  5. 安全注意事项

    • 确保您的回调地址(Redirect URI)使用HTTPS协议,以保护用户数据的安全。

通过上述步骤,您可以在前端构建微信H5页面的授权URL,并引导用户进行授权。这个过程涉及到用户授权、获取授权码(code),以及后续的access_token和用户信息的获取,都是微信H5页面登录鉴权流程中的关键环节。

  1. 用户在微信中打开公众号H5页面,点击授权按钮。
  2. 微信服务器会向用户展示授权确认页面,用户需要确认授权。
  3. 用户确认授权后,微信服务器会将授权码返回给公众号H5页面。
  4. 公众号H5页面将授权码发送给自己的服务器。
  5. 公众号服务器将授权码和公众号AppID、AppSecret发送给微信服务器,以换取access_token和openid。
  6. 公众号服务器将access_token和openid存储在数据库中,并返回给公众号H5页面。
  7. 公众号H5页面使用access_token和openid获取用户信息。

参考H5前端开发最佳实践