springboot+jwt+微信小程序授权登录获取token的方法实例

目录
  • 前言
  • 配置
  • XcxAuthenticationProvider
  • XcxAuthenticationToken
  • 小程序授权登录

前言

我们有时候在开发中,遇到这样的问题,就是我们需要小程序授权登录我们自己的后台,通过小程序的信息换取我们自己后台的token,实现账号密码、小程序授权登录的多种登录方式。

配置

在 SecurityConfig文件中配置

XcxAuthenticationProvider

public class XcxAuthenticationProvider implements AuthenticationProvider {
    private UserDetailsService userDetailsService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        XcxAuthenticationToken authenticationToken = (XcxAuthenticationToken) authentication;

        String openId = (String) authenticationToken.getPrincipal();

        XcxUserService service= SpringContextUtil.getContext().getBean(XcxUserService.class);

        UserDetails userDetails = service.loadUserByOpenId(openId);

        // 此时鉴权成功后,应当重新 new 一个拥有鉴权的 authenticationResult 返回
        XcxAuthenticationToken authenticationResult = new XcxAuthenticationToken(userDetails, userDetails.getAuthorities());

        authenticationResult.setDetails(authenticationToken.getDetails());

        return authenticationResult;
    }

    @Override
    public boolean supports(Class<?> authentication) {
        // 判断 authentication 是不是 SmsCodeAuthenticationToken 的子类或子接口
        return XcxAuthenticationToken.class.isAssignableFrom(authentication);
    }

    public UserDetailsService getUserDetailsService() {
        return userDetailsService;
    }

    public void setUserDetailsService(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }
}

XcxAuthenticationToken

public class XcxAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = 420L;
    private final Object principal;

    /**
     * 没登录之前,principal我们使用手机号
     * @param openid
     */
    public XcxAuthenticationToken(String openid) {
        super((Collection)null);
        this.principal = openid;
        this.setAuthenticated(false);
    }

    /**
     * 登录认证之后,principal我们使用用户信息
     * @param principal
     * @param authorities
     */
    public XcxAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
        this.principal = principal;
        super.setAuthenticated(true);
    }
    public Object getCredentials() {
        return null;
    }
    public Object getPrincipal() {
        return this.principal;
    }
    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
        if (isAuthenticated) {
            throw new IllegalArgumentException("Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
        } else {
            super.setAuthenticated(false);
        }
    }
    public void eraseCredentials() {
        super.eraseCredentials();
    }
}

小程序授权登录

@RestController
@RequestMapping("/xcx")
@AllArgsConstructor
@Api(value = "认证模块", tags = "认证模块")
public class XcxAuthController {

    private JwtService jwtService;
    private JwtUserDetail jwtUserDetail;
    private XcxUserService userService;
    private AuthenticationManager authenticationManager;

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ApiOperation(value = "登录", notes = "登录")
    public Result login(@RequestBody Map<String, Object> map) {
        HashMap<String, Object> hashMap = new HashMap<>();
        String code = String.valueOf(map.get("code"));
        try {
            WxMaService wxMaService = WxMaConfiguration.getWxMaService();
            WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);

            XcxUser user = userService.getOne(Wrappers.<XcxUser>lambdaQuery()
                        .eq(XcxUser::getOpenId, session.getOpenid()), false);
                if (ObjectUtil.isNull(user)) {
                    //过滤掉表情
                    user = XcxUser.builder()
                            .openId(session.getOpenid())
//                        .nickname(wxMpUser.getNickName())
//                        .avatar(wxMpUser.getAvatarUrl())
                            .build();
                userService.save(user);
            } else {
                userService.updateById(user);
            }
            UserDetails userDetails = jwtUserDetail.loadUserByOpenId(session.getOpenid());
            authenticationManager.authenticate(new XcxAuthenticationToken(session.getOpenid()));
            Map<String, Object> parse = JSON.parseObject(JSON.toJSONString(userDetails), Map.class);
            String token = jwtService.createToken(parse);
            hashMap.put("token", token);
            hashMap.put("user", userDetails);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.success(hashMap);
    }

}

这里就基本完成了小程序的授权登录获取token的功能了,希望可以帮助到大家

到此这篇关于springboot+jwt+微信小程序授权登录获取token的方法实例的文章就介绍到这了,更多相关springboot 小程序授权登录获取token内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot整合Sa-Token实现登录认证的示例代码

    目录 依赖 登录 退出登录 前后端分离 今天分享的是 Spring Boot 整合 Sa-Token 实现登录认证. 依赖 首先,我们需要添加依赖: 关键依赖: <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.28.0</version> </depend

  • SpringBoot实现token登录的示例代码

    为什么引入token机制? 在进行登录验证时,我们需要session或cookie会话进行验证,客户端包括浏览器.app.微信小程序.公众号,只有浏览器有session和cookie机制,当我们脱离浏览器用app等向服务端发请求就没有session和cookie机制,这时我们就需要使用token令牌进行登录验证. 代码实现 先建个util包,并创建TokenUtil类用于生成token TokenUtil类代码 package com.qcby.util; import com.qcby.ent

  • SpringBoot JWT实现token登录刷新功能

    目录 1. 什么是JWT 2. JWT组成部分 3. JWT加密方式 4.实战 5.总结 1. 什么是JWT Json web token (JWT) 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.简答理解就是一个身份凭证,用于服务识别. JWT本身是无状态的,这点有别于传统的session,不在服务端存储凭证.这种特性使其在分布式场景,更便于扩展使用. 2. JWT组成部分 JWT有三部分组成,头部(header),载荷(payload),是签名(signature). 头

  • SpringBoot框架集成token实现登录校验功能

    简介 公司新项目,需要做移动端(Android和IOS),登录模块,两个移动端人员提出用token来校验登录状态,一脸懵懵的,没做过,对于token的基本定义都模棱两可,然后查资料查查查,最终OK完成,写篇博客记录一下 思路: 1.基于session登录 基于session的登录(有回话状态),用户携带账号密码发送请求向服务器,服务器进行判断,成功后将用户信息放入session,用户发送请求判断session中是否有用户信息,有的话放行,没有的话进行拦截,但是考虑到时App产品,牵扯到要判断用户

  • springboot+jwt+微信小程序授权登录获取token的方法实例

    目录 前言 配置 XcxAuthenticationProvider XcxAuthenticationToken 小程序授权登录 前言 我们有时候在开发中,遇到这样的问题,就是我们需要小程序授权登录我们自己的后台,通过小程序的信息换取我们自己后台的token,实现账号密码.小程序授权登录的多种登录方式. 配置 在 SecurityConfig文件中配置 XcxAuthenticationProvider public class XcxAuthenticationProvider implem

  • springboot+jwt+springSecurity微信小程序授权登录问题

    场景重现:1.微信小程序向后台发送请求 --而后台web采用的springSecuriry没有token生成,就会拦截请求,,所以小编记录下这个问题 微信小程序授权登录问题 思路 参考网上一大堆资料 核心关键字: 自定义授权+鉴权 (说的通俗就是解决办法就是改造springSecurity的过滤器) 参考文章 https://www.jb51.net/article/204704.htm 总的来说的 通过自定义的WxAppletAuthenticationFilter替换默认的UsernameP

  • 微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)

    本文实例为大家分享了微信小程序授权登录解决方案的具体代码,供大家参考,具体内容如下 getUserInfoF:function(){ var that = this; wx.getSetting({ success: (res) => { console.info(res.authSetting); wx.getUserInfo({ success: res => { this.globalData.userInfo = res.userInfo console.info("一开始同

  • 微信小程序授权登录的优雅处理方式

    前言 当微信小程序项目中涉及到获取用户信息并实现用户登录时,可以通过微信官方提供的登录能力方便地获取微信的用户身份标识,快速建立小程序内的用户体系.官方文档只是提供如何去调用授权登录,如果直接原封不动的照搬文档来进行代码编写,这样势必会造成代码的维护性差,所以本篇着重介绍如果更优雅的处理微信小程序的授权登录. 授权登录的基本流程 上图是微信小程序官网提供的授权登录基本流程图,这里我只从前端开发的角度来讲解一下该流程. 通过wx.login()获取临时登录凭证code. 通过调用服务端提供的接口把

  • uni-app 微信小程序授权登录的实现步骤

    目录 一.appID相关申请和配置 1. appid获取方式 2. appID配置 二.获取用户基础数据 2.1. 获取用户信息 2.2. 获取用户信息2 三.调用登录api 3.1. 登录api 3.2. 案例代码 四.获取唯一标识信息 4.1. 官网文档 4.2. 接口简述 五.绑定用户 实现登录 5.1. 代码案例(未封装) 5.2. 代码案例(封装) 六.项目开源地址 6.1. 前端 6.2. 后端 一.appID相关申请和配置 1. appid获取方式 登录微信公众平台 官网链接:ht

  • C#微信小程序服务端获取用户解密信息实例代码

     C#微信小程序服务端获取用户解密信息实例代码 实现代码: using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; namespace AIOWe

  • 微信小程序中使用 async/await的方法实例分析

    本文实例讲述了微信小程序中使用 async await的方法.分享给大家供大家参考,具体如下: 微信小程序中有大量接口是异步调用,比如 wx.login().wx.request().wx.getUserInfo() 等,都是使用一个对象作为参数,并定义了 success().fail() 和 complete() 作为异步调用不同情况下的回调. 但是,以回调的方式来写程序,真的很伤,如果有一个过程需要依次干这些事情: wx.getStorage() 获取缓存数据,检查登录状态 wx.getSe

  • 微信小程序与后台PHP交互的方法实例分析

    本文实例讲述了微信小程序与后台PHP交互的方法.分享给大家供大家参考,具体如下: 接下来将讲后台如何与前台进行数据及图片之间的交互,相信这一点是很多人所关注的,因为当时我实在团队中负责后台开发,因此对前端不是特别了解,这里我会贴出前端开发时的部分代码截图,微信小程序的官方api介绍地址是: https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-network.html 微信与后台服务器之间的数据通信是调用wx.request(OBJECT)实现的,官

  • 微信小程序 授权登录详解(附完整源码)

    一.前言 由于微信官方修改了 getUserInfo 接口,所以现在无法实现一进入微信小程序就弹出授权窗口,只能通过 button 去触发. 官方连接:https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01 二.实现思路 自己写一个微信授权登录页面让用户实现点击的功能,也就是实现了通过 button 组件去触发 getUserInof 接口.在用户进入微信小程序的时候,判断用户是否

  • php实现微信小程序授权登录功能(实现流程)

    先上图 实现流程: 1.授权登陆按钮和正文信息放到了同一个页面,未授权的时候显示登陆按钮,已授权的时候隐藏登陆按钮,显示正文信息,当然也可以授权和正文分开成两个页面,在授权页面的onload里判断是否已授权,若已授权就直接跳转正文的页面.这里只说授权按钮和正文在同一页面的情况. 2.在onload里先判断是否已授权,如果已授权,就隐藏授权登陆按钮,显示正文信息,如果没有授权,显示授权登陆按钮. 3.前端使用button的open-type="getUserInfo"来操作,点击授权按钮

随机推荐