-
引导用户进入授权页面:
- 前端通过构建一个授权URL,引导用户进入微信的授权页面。这个URL包含了小程序的
appid
、回调地址redirect_uri
、作用域scope
等参数。
- 前端通过构建一个授权URL,引导用户进入微信的授权页面。这个URL包含了小程序的
-
用户同意授权,获取code:
- 用户在微信授权页面同意授权后,微信会重定向到指定的回调URL,并附带一个
code
参数,这个code
是临时的授权凭证。
- 用户在微信授权页面同意授权后,微信会重定向到指定的回调URL,并附带一个
-
后端通过code换取网页授权access_token:
- 前端将获取到的
code
发送到后端服务器,后端使用这个code
向微信服务器请求access_token
和用户的openid
。这一步是在服务器端完成的,以保护appsecret
不被泄露。
- 前端将获取到的
-
如果需要,开发者可以刷新网页授权access_token,避免过期:
access_token
有有效期限制,如果需要可以刷新access_token
以保持用户登录状态。
-
通过网页授权access_token和openid获取用户基本信息:
- 最后,使用获取到的
access_token
和openid
,后端可以请求微信服务器获取用户的基本信息,如昵称、头像等。
- 最后,使用获取到的
在整个流程中,前端负责引导用户进入授权页面并接收code
,后端负责使用code
与微信服务器交互,获取access_token
和用户信息。微信服务器则提供授权和用户信息的接口。
这个流程确保了用户信息的安全,因为用户敏感信息的获取完全在后端进行,前端只负责传递code
,不直接接触用户的access_token
和openid
。这样的设计也符合微信官方的安全最佳实践
前端如何构建授权URL?
-
获取AppID和Redirect URI:
- 首先,您需要在微信公众平台注册应用并获取AppID。
- 确定您的回调地址(Redirect URI),这是用户授权后微信将重定向回的地址。
-
构造授权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
表示需要获取用户信息。
-
-
前端页面重定向:
-
在前端页面中,当用户点击登录按钮时,使用
window.location.href
重定向到上面构造的授权URL:window.location.href = getAuthUrl(currentUrl);
-
这里
currentUrl
是用户当前页面的URL,用于在授权结束后返回到原页面。
-
-
处理微信授权回调:
- 用户授权后,微信会重定向回您的回调地址,并附带
code
参数。您需要在服务器端接收这个code
,并用它来换取access_token和用户信息。
- 用户授权后,微信会重定向回您的回调地址,并附带
-
安全注意事项:
- 确保您的回调地址(Redirect URI)使用HTTPS协议,以保护用户数据的安全。
通过上述步骤,您可以在前端构建微信H5页面的授权URL,并引导用户进行授权。这个过程涉及到用户授权、获取授权码(code),以及后续的access_token和用户信息的获取,都是微信H5页面登录鉴权流程中的关键环节。
- 用户在微信中打开公众号H5页面,点击授权按钮。
- 微信服务器会向用户展示授权确认页面,用户需要确认授权。
- 用户确认授权后,微信服务器会将授权码返回给公众号H5页面。
- 公众号H5页面将授权码发送给自己的服务器。
- 公众号服务器将授权码和公众号AppID、AppSecret发送给微信服务器,以换取access_token和openid。
- 公众号服务器将access_token和openid存储在数据库中,并返回给公众号H5页面。
- 公众号H5页面使用access_token和openid获取用户信息。
参考: H5前端开发最佳实践