网页授权获取用户基本信息
用户点下“允许”按钮的网页那一秒,你的授权服务器就拿到了一把钥匙——不是用户名和密码,而是用户一个有时效的授权凭证。这就是基本网页授权的本质:用户不必把账号密码交给第三方应用,也能让应用读取自己的信息基础信息。 微信生态里的网页网页授权,走的授权是OAuth 2.0协议。整个流程拆开看就三步。用户第一步,基本把用户引导到微信的信息授权页面,带上你的网页AppID、回调地址和scope参数。授权scope有两个值: 我见过不少开发者在这第一步就踩坑。回调地址没做URL编码,或者带了多余的参数,微信直接返回“redirect_uri参数错误”。还有人把回调地址写成了内网IP,用户手机上根本访问不到。这些细节看着小,调试起来能耗掉一整个下午。 第二步,用户同意后,微信会把浏览器重定向到你指定的回调地址,并在URL里附上一个 第三步,如果scope是 有个做电商的朋友跟我聊过,他们一开始用 access_token的有效期是两小时,过期后需要用 还有一点值得提:网页授权获取的openid和公众号消息接口里的openid是同一个。但如果是不同公众号,同一个用户的openid不同。要跨公众号识别用户,得用UnionID。UnionID的获取前提是公众号绑定了开放平台账号。这个机制设计得挺绕,但理解了之后能省不少事。 实际开发中,建议把授权逻辑封装成一个中间件。用户访问需要授权的页面时,中间件检查session里有没有openid。没有就跳转授权,有就直接放行。这样业务代码不用关心授权细节,只处理用户信息就行。回调地址建议单独用一个路由,不要和业务路由混在一起,否则容易出重定向循环。 最后说个真实案例。某次线上故障,用户授权后一直卡在回调页面。查了半天发现是Nginx配置里把snsapi_base和snsapi_userinfo。用户前者静默授权,基本用户无感知,信息只能拿到openid;后者会弹出确认框,用户点击同意后才能获取昵称、头像、性别、地区这些信息。code参数。这个code有效期只有五分钟,而且只能用一次。拿到code之后,你的后端得立刻向微信服务器发起请求,换取access_token和openid。这里有个容易忽略的点:换取access_token的请求必须从你的服务器发出,不能在前端用JavaScript直接调,否则AppSecret会暴露在浏览器里。snsapi_userinfo,你可以用拿到的access_token和openid再去拉一次用户信息。返回的JSON里包含nickname、headimgurl、language等字段。注意,headimgurl默认是132×132的方形头像,如果要高清图,得手动把URL末尾的/132改成/0。这个技巧微信文档里没写,但实测有效。snsapi_base静默授权,只拿openid做用户标识。后来想给用户展示头像和昵称,不得不改成snsapi_userinfo。结果发现,已经授权过的老用户重新走一遍流程时,微信不再弹确认框,直接静默返回信息——因为用户之前已经授权过这个公众号。这个行为微信没有明确文档说明,但实际就是这样。refresh_token刷新。refresh_token的有效期是三十天。很多开发者图省事,每次请求都重新走一遍完整授权流程,用户体验差不说,微信也有频率限制。正确的做法是在服务端缓存access_token和refresh_token,快过期时主动刷新。code参数给过滤掉了。微信回调的URL里带了一长串参数,Nginx默认的underscores_in_headers设置把带下划线的参数名给丢了。改完配置重启,问题消失。这种坑,不踩一次根本想不到。
-
上一篇
-
下一篇