跳到主要内容

微信扫码认证

2025年01月08日
柏拉文
越努力,越幸运

一、认识


微信扫码登录认证 是现代 Web 应用中广泛使用的一种身份验证方式,特别是在移动端和跨平台场景下。它结合了微信作为一个 庞大的身份提供者(IdP 和扫码技术的便捷性,实现了快速的用户身份认证。微信扫码登录认证 的实现原理涉及多个复杂的环节,包括 OAuth 2.0 协议、二维码生成、扫码确认和实时回调等机制。

微信扫码登录 的通知机制是基于 HTTP 重定向来实现的。在用户扫码并同意授权后,微信通过重定向将授权码(code)传递给 Web 应用。Web 应用再通过 code 获取 access_token,从而完成身份认证。这一过程不涉及 WebSocket 或其他实时通信机制,而是通过标准的 HTTP 协议和 OAuth 2.0 的授权码流程来完成认证和授权。

二、工作流


1. 用户发起登录请求: 用户在 Web 应用(或其他客户端)点击 微信登录 按钮,触发登录流程。Web 应用会调用微信的开放平台提供的 OAuth 认证接口, Web 应用会生成一个请求 URL,该 URL 指向微信的授权端点,并包含一些必要的参数, 比如: client_idWeb 应用的唯一标识)、redirect_uri(用户授权后重定向的地址)、scope(请求的权限范围,如 snsapi_userinfo,用于获取用户信息), response_type(通常为 code,表示请求授权码)。 OAuth 认证请求 URL如下所示:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=your_app_id&redirect_uri=https://yourapp.com/callback&response_type=code&scope=snsapi_userinfo&state=1234#wechat_redirect

2. 生成二维码: Web 应用请求微信服务器生成一个二维码,二维码包含一个认证 url,此 URL 中包含了一个唯一的 auth_code。用户通过扫码的方式,将这个 auth_code 发送到微信客户端,微信客户端会验证用户身份(通常是已登录的用户)并确认是否授权。

3. 用户扫码并确认授权: 用户通过微信打开二维码,扫码后会看到一个确认页面,提示是否授权登录 Web 应用。如果用户授权,微信会生成一个授权码(通常是 code),微信服务器会将用户授权的 code 发送回 Web 应用。在 OAuth 2.0 授权码模式下,微信会通过 HTTP 重定向的方式将 code 附加到 redirect_uri 的查询参数中(例如:redirect_uri?code=authorization_code)。用户扫码并授权后,微信会将用户重定向到 https://yourapp.com/callbackURL 如下:

https://yourapp.com/callback?code=authorization_code&state=1234

4. Web 应用通过 code 获取 access_token: Web 应用通过重定向的 URL 获得 code(授权码)。之后,Web 应用会使用这个 code 向微信的 Token Endpoint 发送 POST 请求,交换 access_tokenopenid 等用户信息。请求中会包含以下参数: client_idWeb 应用的唯一标识)、client_secretWeb 应用的密钥,用于身份验证)、code(用户从微信获取的授权码)、redirect_uri(与授权请求时的 URI 一致)。微信的 Token Endpoint 会验证请求的合法性,返回 access_tokenopenidrefresh_token 等数据。Web 应用在 https://yourapp.com/callback 页面获取到 code,然后用 code 发起 POST 请求向微信的 Token Endpoint 请求 access_token,请求 URL 如下:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=your_app_id&secret=your_app_secret&code=authorization_code&grant_type=authorization_code

5. 用户信息存储与会话创建: Web 应用将用户的 access_tokenopenid 作为标识存储在本地(如通过 cookiesessionlocalStorage),并且为用户创建一个本地会话。同时,Web 应用可以利用微信返回的用户信息(如昵称、头像等)来个性化展示。微信返回如下响应,Web 应用通过 access_token 获取用户信息:

{
"access_token": "ACCESS_TOKEN",
"expires_in": 7200,
"refresh_token": "REFRESH_TOKEN",
"openid": "USER_OPENID",
"scope": "snsapi_userinfo"
}

6. 授权登录成功后回调: 一旦认证过程完成,Web 应用会将用户重定向到指定的回调页面。此页面会展示登录成功的信息或者用户首页。 一般认证完成后, 需要跳转到完善信息的页面,填写手机号和其他信息。