基于.net5 wtm框架、uni-app微信公众号开发三、Jwt认证 and oAuth

时间:2021-01-27 13:35:24   收藏:0   阅读:0

Jwt认证 and oAuth

前后台项目已经搭建完成,接下来要处理微信网页授权、获取用户信息并且绑定到后台
0、修改util.js

// 已经授权登录过并且token未过期的就不用再授权了
		if (uni.getStorageSync(‘jwtToken‘) != ‘‘ &&
			uni.getStorageSync(‘jwtTokenTimestamp‘) - new Date() > 60000) 
			return;
		else if (uni.getStorageSync(‘jwtToken‘) != ‘‘ &&
			uni.getStorageSync(‘jwtTokenTimestamp‘) - new Date() < 60000) {
			// 已经授权登录过并且token快过期的就刷新token(60秒)
			tsRequest.get(
				api_host + ‘/api/_Account/getRefreshToken‘, 
				{‘refreshToken‘: uni.getStorageSync(‘jwtRefresh_token‘)},
				{"Authorization":"Bearer "+uni.getStorageSync(‘jwtToken‘)}				
			).then(
				function(res) {
					if (res.statusCode == 200) that.setJwtToken(res.data);					
				},
				function(err) {
					console.log("login.vue_err:" + JSON.stringify(err));
				});
			return;
		}

// 如果拿到code,调用授权接口,没有拿到就跳转微信授权链接获取
		if (params.code) {
			// 调用后台接口,授权
			tsRequest.get(
				api_host + ‘/api/_Wx/BindUserInfo‘, {
					‘code‘: params.code,
					‘scope‘: scope
				},
			).then(
				function(res) {
					if (res.statusCode == 200) that.setJwtToken(res.data.Result);
				},
				function(err) {
					console.log("login.vue_err:" + JSON.stringify(err));
				});
		} else {
			let uri = encodeURIComponent(link);
			let authURL =
				`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${uri}&response_type=code&scope=${scope}&state=123#wechat_redirect`;
			window.location.href = authURL;
		}
//setJwtToken函数,把jwtToken保存到缓存
setJwtToken(data){
		//缓存token和过期时间
		uni.setStorageSync(‘jwtToken‘, data.access_token);//token
		uni.setStorageSync(‘jwtRefresh_token‘, data.refresh_token);//用于到期刷新token
		uni.setStorageSync(‘jwtTokenTimestamp‘, new Date().getTime() + data.expires_in * 1000);//token过期时间,服务端返回expires_in 单位是秒,因此乘以1000转化为毫秒
	}

1、后台提供两个Get接口,BindUserInfo、getRefreshToken,这里使用直接使用WTM框架提供的JWT认证模式

   #region 绑定用户信息
        /// <summary>
        /// 绑定用户信息
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet("[action]")]
        public async Task<IActionResult> BindUserInfo(string code,string scope= "snsapi_base")
        {
            OAuthAccessTokenResult oAuthAccessTokenResult = await GetAccessTokenAsync(AppId, AppSecret, code);
            OAuthUserInfo oAuthUserInfo = new OAuthUserInfo();
            if (scope== "snsapi_userinfo")
                oAuthUserInfo = await GetUserInfoAsync(oAuthAccessTokenResult.access_token, oAuthAccessTokenResult.openid);

            var up = DC.Set<Tb_Userplatform>()
                .Where(x => x.OpenID == oAuthAccessTokenResult.openid).FirstOrDefault();
            var u = new Tb_User();
            //该用户被伪删
            if (up != null && up.Status == 1)
            {
                u = DC.Set<Tb_User>()
               .Where(x => x.ID == up.UserID).FirstOrDefault();
                if (u != null && u.Status == 1)
                {
                    u.Status = 0;
                    DC.Set<Tb_User>().Update(u);
                }
                up.Status = 0;
                DC.Set<Tb_Userplatform>().Update(up);
                DC.SaveChanges();
            }
            else if (up != null && up.Status == 0)
            {
                //登录,并同步更新昵称头像
                u = DC.Set<Tb_User>()
               .Where(x => x.ID == up.UserID).FirstOrDefault();

                u.NickName = string.IsNullOrWhiteSpace(oAuthUserInfo.nickname)
                    ? u.NickName
                    : oAuthUserInfo.nickname;

                u.HeadImg = string.IsNullOrWhiteSpace(oAuthUserInfo.headimgurl)
                   ? u.HeadImg
                   : oAuthUserInfo.headimgurl;
                DC.Set<Tb_User>().Update(u);
                DC.SaveChanges();
            }
            else if (up == null)
            {//新用户注册并登录
                u = new Tb_User()
                {
                    HeadImg = oAuthUserInfo.headimgurl,
                    AddTime = DateTime.Now,
                    Integral = 0,
                    NickName = string.IsNullOrWhiteSpace(oAuthUserInfo.nickname)
                    ? "小可爱"
                    : oAuthUserInfo.nickname,
                    Status = 0,
                    VipLevel = 1,
                    Balance = 0,
                    RegTime = DateTime.Now
                };
                u = DC.Set<Tb_User>().Add(u).Entity;
                DC.SaveChanges();

				//WTM默认jwt认证
                up = new Tb_Userplatform()
                {
                    AddTime = DateTime.Now,
                    Status = 0,
                    BindTime = DateTime.Now,
                    LoginNum = 1,
                    OpenID = oAuthAccessTokenResult.openid,
                    PlatformType = 0,
                    UserID = u.ID
                };
                up = DC.Set<Tb_Userplatform>().Add(up).Entity;
                DC.SaveChanges();
            }

            LoginUserInfo user = new LoginUserInfo()
            {
                ITCode = u.ID + "",
                 Name=u.NickName,                  
                TenantCode = oAuthAccessTokenResult.openid
            };
            string token = loginToToken(user);

            return Ok(token);
        }
       
 private string loginToToken(LoginUserInfo user)
        {
            user.LoadBasicInfoAsync(Wtm);
            Wtm.LoginUserInfo = user;

            var authService = HttpContext.RequestServices.GetService(typeof(ITokenService)) as ITokenService;

            var token =  authService.IssueTokenAsync(Wtm.LoginUserInfo);
            return JsonSerializer.Serialize(token);
        }
        #endregion

//过期刷新token接口
        [HttpGet("[action]")]
        [AllRights]
        [ProducesResponseType(typeof(Token), StatusCodes.Status200OK)]
        public async Task<Token> getRefreshToken(string refreshToken)
        {
            return await _authService.RefreshTokenAsync(refreshToken);
        }
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!