微信小程序登录鉴权与获取用户信息

前言

在小程序中,与云开发相比,传统的前后端开发在登录鉴权的实现方面相对来说更加复杂,不仅需要前端和后端的交互,后端还需要与微信接口服务进行交互,以完成整个鉴权流程:

img

整个流程简单来说分为以下7步:

  1. 前端调用wx.login()获取临时登录凭证code,并回传到开发者服务器。
  2. 服务器调用auth.code2Session换取用户唯一标识OpenID和会话密钥session_key
  3. 服务器端根据OpenIDsession_key生成自定义登录态(可以理解为是token),将token响应给前端。
  4. 前端将token存入Storage中。
  5. 当前端之后向后端发起请求时,就会带上token
  6. 后台通过token(或者其他类型密钥),解密获取OpenID,判断是哪个用户的行为,做出响应的逻辑处理(比如操作数据库等)。
  7. 后台响应数据给前端。

这个是小程序登录的流程,但是小程序登录和小程序获取用户信息并不是一回事。小程序登录的APIwx.login,可以获取用户的openIDopenID是用户的唯一标识,是比较隐私的数据,一般不会返回给前端。小程序获取用户信息的APIwx.getUserInfo,它可以获取用户的一些基本信息,比如nickNameavatarUrl等。两者不要弄混。

其实微信登录一开始并不是这样的,以往微信小程序在用户没有任何操作的情况下就会直接弹出授权的登录方式,如果用户点击拒绝授权,则无法使用小程序。按照微信官方对这个功能更新的解释是:

因此,微信对开发的建议是:

  1. 当用户打开小程序时访问第一个页面时,先通过wx.login,获取用户 openID 。这时无需弹框授权,开发者拿到 openID 可以建立自身的帐号ID
  2. 在第一步中,拿到 openID 后,判断是新用户还是老用户。如果是老用户,可以直接登录;如果是新用户,可先在小程序首页展示你的信息服务,让用户对这个小程序有大概的了解,再引导用户进行下一步的操作。
  3. 当需要获取用户头像昵称的时候,对用户展示一个登录页面,这个页面只有一个最重要的操作,引导用户进行登录。

小程序登录

在上一节中有提到,小程序登录可以分为7个步骤,下面就详细讲一下7个步骤具体是如何实现。

step1: 前端调用wx.login()获取临时登录凭证code

在项目中,我使用了Taro框架,所以调用的API对应为Taro.login()

Taro.login({})
      .then((res) => {
        if (res.code) {
          // 将code发送到后台,以获取token
          getToken(res.code)
            .then((res: any) => {
              const { token, userExist } = res;

              // 将token存储到Storage中
              Taro.setStorageSync('token', token);

              // 如果是老用户,获取用户信息
              if(userExist) {
                const { userInfo } = res;
                Taro.setStorageSync('userInfo', userInfo);
              }
            })
            .catch((err) => {
              console.error(err);
            });
        } else {
          console.log('登录失败! ' + res.errMsg);
        }
      })
      .catch((err) => {
        console.error(err);
      });

step2: 服务端调用auth.code2Session换取openid和session_key

服务端调用外部接口需要使用egg.js中的一个apithis.ctx.curl,因为是异步请求,所以需要加上await

// app/controller/home.js
// login接口
async login() {
   
    const {
    ctx } = this;
    const {
    code } = ctx.request.body;
    // 服务器根据客户端传来的code向微信接口服务获取session_key和openid
    const res = await ctx.curl(
        `https://api.weixin.qq.com/sns/jscode2session?		
    appid=wx6936c18b38186cf3&secret=d11f77fb7d5a959b6ba46c30dbd4da95&js_code=${
     code}&grant_type=authorization_code`,
        {
   
        	dataType: 'json',
        }
    );
    const {
    openid } = res.data;  // 获取到openid
}

step3: 根据openid生成自定义登录态token,响应给前端

因为openid是用户的唯一标识,根据它生成token,响应给前端后,前端每次发请求带上token,后台解密请求中的token,获取到openid,便能识别这是哪个用户的请求行为。

这里我们使用jwt来生成自定义登录态token,使用jwt-simple库来生成jwt

const jwt = require('jwt-simple');
const SECRET = 'zhuoran'; // 自定义

async login() {
   
    ...
    const {
    openid } = res.data;  // 获取到openid
    
    // 根据用户的openid生成token
    const token = jwt.encode(openid, SECRET);
    
    
  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现微信小程序登录,可以使用Spring Security提供的OAuth 2.0协议实现。以下是基本的步骤: 1. 在微信开放平台中创建小程序获取AppID和AppSecret。 2. 在Spring Security中配置OAuth 2.0客户端,设置微信小程序的AppID、AppSecret以及授权范围。 3. 创建一个Controller,处理微信小程序登录请求。在该Controller中,使用RestTemplate向微信平台发送请求,获取access_token和openid等信息。 4. 根据openid创建用户信息,并将用户信息存储在数据库中。 5. 在Spring Security中配置自定义的UserDetailsService,根据openid从数据库中查询用户信息并返回。 6. 在Spring Security中配置自定义的AuthenticationProvider,对用户进行认证。 具体实现细节可以参考Spring Security官方文档和示例代码。 ### 回答2: Spring Security可以用于实现微信小程序登录功能。下面是实现该功能的大概步骤: 1. 配置微信小程序开放平台的AppID和AppSecret,并获取sessionKey和openid。 2. 创建一个用于处理登录请求的接口,并在该接口中获取小程序传递的code参数。 3. 使用HTTP请求,向微信服务器发送code和之前配置的AppID、AppSecret,以获取openid和sessionKey。 4. 将获取到的openid和sessionKey存储在数据库中,作为用户的登录凭证。 5. 创建一个用户实体类,并添加相应的字段,比如openid、sessionKey等。 6. 实现一个自定义的UserDetailsService接口,用于根据openid查询用户信息。 7. 创建一个TokenGranter类,用于创建自定义的Token,包含openid和sessionKey等信息。 8. 实现一个自定义的AuthenticationProvider类,用于根据Token进行认证,并授权用户的访问权限。 9. 创建一个自定义的AuthenticationFilter类,用于处理登录请求,并验证用户的Token是否有效。 10. 将上述配置添加到Spring Security的配置类中,并配置相关的路径和权限。 通过上述步骤,我们可以实现微信小程序登录功能。用户通过小程序登录后,系统会根据openid查询用户信息,并通过Token进行认证和授权,确保用户可以访问相应的资源。同时,可以根据业务需求,在上述步骤中添加其他的逻辑处理。 ### 回答3: Spring Security是基于Java的安全框架,用于处理应用程序的认证和授权功能。要实现微信小程序登录,可以按照以下步骤进行: 1. 配置微信小程序登录:首先,需要在微信开发者平台注册小程序,并获取小程序的AppID和AppSecret。然后,在Spring Security配置中,配置微信登录的认证提供商和回调URL。例如,在`SecurityConfig`类中可以使用`WeChatAuthenticationFilter`来处理微信登录流程和认证。 2. 创建WeChatAuthenticationFilter:继承`AbstractAuthenticationProcessingFilter`类,重写`attemptAuthentication`方法,实现微信登录的认证逻辑。在该方法中,将获取到的小程序code发送到微信服务器,通过code获取到微信用户的唯一标识OpenID和会话标识SessionKey。 3. 自定义AuthenticationProvider:创建一个自定义的`AuthenticationProvider`实现类,用于处理微信登录的认证逻辑。在该类中,可以根据微信的OpenID进行用户的查询和创建,生成用户的凭证信息,并返回一个实现了`Authentication`接口的认证对象。 4. 处理认证成功和失败的逻辑:在`SuccessfulAuthenticationHandler`中处理认证成功的逻辑,例如生成并返回JWT Token给前端;在`FailureAuthenticationHandler`中处理认证失败的逻辑,例如返回登录失败的提示信息给前端。 5. 配置微信登录接口和拦截器:配置微信登录的接口路径和访问权限,使用`WeChatAuthenticationFilter`拦截微信登录请求,进行认证处理。 通过以上步骤,就可以实现Spring Security与微信小程序登录功能。当用户通过微信小程序登录时,将会调用相应的微信登录接口,并经过认证流程完成登录。根据需求可以进行进一步的用户信息补全、鉴权授权等功能的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值