首页 > 其他分享 >uniLogin 一键登录

uniLogin 一键登录

时间:2023-10-18 11:55:06浏览次数:36  
标签:openid return String 登录 一键 uniLogin secret result const

一、通过传统服务器连接uniCloud云函数

首先上传云函数:官网地址

// 云函数验证签名,此示例中以接受GET请求为例作演示
const crypto = require( 'crypto' )
exports.main = async(event) => {
 
  const secret =  'your-secret-string' // 自己的密钥不要直接使用示例值,且注意不要泄露
  const hmac = crypto.createHmac( 'sha256' , secret);
 
  let params = event.queryStringParameters
  const sign = params.sign
  delete params.sign
  const signStr = Object.keys(params).sort().map(key => {
    return `${key}=${params[key]}`
  }).join( '&' )
 
  hmac.update(signStr);
 
  if (sign!==hmac.digest( 'hex' )){
    throw new Error( '非法访问' )
  }
 
  const {
    access_token,
    openid
  } = params
  const res = await uniCloud.getPhoneNumber({
    provider:  'univerify' ,
    appid:  'xxx' ,  // DCloud appid,不同于callFunction方式调用,使用云函数Url化需要传递DCloud appid参数
    apiKey:  'xxx' ,  // 在uniCloud控制台开通一键登录服务并获取apiKey
    apiSecret:  'xxx' ,  // 在uniCloud控制台开通一键登录服务并获取apiSecret
    access_token: access_token,
    openid: openid
  })
  // 返回手机号给自己服务器
  return res
}

  返回结果:

{
	"data": {
		"code": 0,
		"success": true,
		"phoneNumber": "166xxxx6666"
	},
	"statusCode": 200,
	"header": {
		"Content-Type": "application/json; charset=utf-8",
		"Connection": "keep-alive",
		"Content-Length": "53",
		"Date": "Fri, 06 Nov 2020 08:57:21 GMT",
		"X-CloudBase-Request-Id": "xxxxxxxxxxx",
		"ETag": "xxxxxx"
	},
	"errMsg": "request:ok"
}

 

java后端工作:

public AuthFrontLoginRespVO uniLogin(AuthUniLoginReqVO reqVO) {

    log.info("uniLogin获取的mobile的accessToken为:{}======openid为:{}" + reqVO.getAccessToken(),reqVO.getOpenid());
    JSONObject result = getUniMobileInfo(reqVO.getAccessToken(), reqVO.getOpenid());
    //失败案例{"success":false,"error":{"code":"FunctionBizError","message":"5000:errCode: 5000 | errMsg: 获取手机号码失败:获取号码失败"}}
    //登录成功{"code":0,"success":true,"phoneNumber":"18888888888"}

    //判断是否正常相应
    if(!result.containsKey("success")){
        log.info(result.toJSONString());
        throw new ServiceException(UNI_GET_MOBILE_FAIL);
    }
    if(!result.getBoolean("success") ){
        log.info(result.toJSONString());
        throw new ServiceException(UNI_GET_MOBILE_FAIL);
    }
    //获取mobile
    String mobile = result.getString("phoneNumber");
    if(!ValidationUtils.isMobile(mobile)){
        log.info(result.toJSONString());
        throw new ServiceException(UNI_GET_MOBILE_FAIL);
    }

    reqVO.setMobile(mobile);
    // 使用uni获取的手机号登录
    OnlineUsersDO user = uniVerify(reqVO);
    // 创建 Token 令牌,记录登录日志
    AuthFrontLoginRespVO respVO=createTokenAfterLoginSuccess(user.getId(),user.getUserName(), LoginLogTypeEnum.LOGIN_UNI);
    respVO.setUserInfo(OnlineUsersConvert.INSTANCE.convertVO(user));
    return respVO;
}
private JSONObject getUniMobileInfo(String accessToken,String openid) {
    JSONObject result = new JSONObject();

    //调用uniapp云函数、置换出、用户手机号码出来。
    String sign = HeaUtil.sha256_HMAC("access_token="+accessToken+"&openid="+openid, this.uniLoginSecret);
    String urlString = this.uniLoginUrl +"?access_token="+accessToken+"&openid="+openid+"&sign="+sign;

    //失败案例{"success":false,"error":{"code":"FunctionBizError","message":"5000:errCode: 5000 | errMsg: 获取手机号码失败:获取号码失败"}}
    //登录成功{"code":0,"success":true,"phoneNumber":"18888888888"}

    try{
        String resultStr = HttpUtil.get(urlString);
        result = JSONObject.parseObject(resultStr);
    }catch (Exception e){
        e.printStackTrace();
        log.error("从uniCloud云函数获取手机号失败");
    }

    return result;
}

 

 

 

package cn.iocoder.yudao.module.system.util;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

/**
 * @Describe: Hmac加密工具类
 */
public class HeaUtil  {


    /**
     * sha256_HMAC加密
     * @param message 消息
     * @param secret 秘钥
     * @return 加密后字符串
     */
    public static String sha256_HMAC(String message, String secret) {
        String hash = "";
        try {
            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
            SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
            sha256_HMAC.init(secret_key);
            byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
            hash = byteArrayToHexString(bytes);
        } catch (Exception e) {
            System.out.println("Error HmacSHA256 ===========" + e.getMessage());
        }
        return hash;
    }

    /**
     * 将加密后的字节数组转换成字符串
     *
     * @param b
     *字节数组
     * @return 字符串
     */
    private static String byteArrayToHexString(byte[] b) {
        StringBuilder hs = new StringBuilder();
        String stmp;
        for (int n = 0; b != null && n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0XFF);
            if (stmp.length() == 1)
                hs.append('0');
            hs.append(stmp);
        }
        return hs.toString().toLowerCase();
    }
}

标签:openid,return,String,登录,一键,uniLogin,secret,result,const
From: https://www.cnblogs.com/Fzzf1/p/17771721.html

相关文章

  • sqlplus本地登录报错,远程可以正常登录
    问题描述:  sqlplus本地登录报错,如下:   sqlplus/asssydba   ERROR:   ORA-12547:TNS:lostcontact原因分析:   首先确保数据库实例正常运行:   srvctlstatusdatabase-dDB_UNIQUE_NAME   ps-ef|greppmon    查看ORACLE_H......
  • php一键打包压缩目录文件代码示例
    <?php$button=$_POST['button'];if($button=="开始打包"){$zip=newZipArchive();$filename="./".date("Y-m-d")."_".md5(time())."_zy.zip";if($zip->......
  • h5网页点击一键跳转小程序
    我的需求是从公众号h5页面,点击跳转某个a链接跳转到小程序,此文档也是记录我的实现过程.开发语音:PHP前期准备工作:微信公众号ip白名单设置      js授权安全域名设置     access_token获取权限设置设置此次开发相关的工作:   登录微信公众后......
  • 用go封装和实现扫码登录
    用go封装和实现扫码登录本篇为用go设计开发一个自己的轻量级登录库/框架吧-秋玻-博客园(cnblogs.com)的扫码登录业务篇,会讲讲扫码登录的实现,给库/框架增加新的功能,最后说明使用方法Github:https://github.com/weloe/token-go扫码登录流程首先我们需要知道扫码登录流程打......
  • 扫码登录场景原理
    扫码登录场景原理解析生成二维码按照时间搓生成二维码.存储到缓存中.并且状态未生成二维码状态轮询状态检查二维码是否过期.过期则提示前台刷新根据不同状态做不同动作手机扫码手机端扫码二维码.识别二维码中的缓存id数据校验id是否已经过期设置二维码状态为已扫描。......
  • Apifox设置登录脚本
    第一步,设置脚本consturl='/Platform/Login/Login'constcurUrl=pm.request.getBaseUrl();letbaseUrl=pm.environment.get("SYS");console.log('sd',baseUrl)constaccount=pm.environment.get("account");constpw......
  • 微信小程序实现微信和账号密码同时登录
    前言微信小程序是一种轻量级的应用程序,可以在微信中直接使用,无需下载和安装。在微信小程序中,用户可以使用微信账号登录,也可以使用账户密码登录。本文将介绍如何在微信小程序中实现微信和账户密码同时登录。正文开始需求分析要在微信小程序中实现微信和账户密码同时登录,您需要进......
  • ECS-Centos7登录页面出现Hint: caps lock on,输入大小写字母反了(大小写反转问题)
    问题描述:虚拟机Centos7,输入大小写字母反了,开启capslock的时候变成小写字母了,关闭则变成大写了。。。解决办法:只需要执行:setleds+caps 或 setleds-caps 即可。如图: ......
  • python+playwright 学习-39.登录页面滑动解锁
    前言登录页面会遇到滑块解锁,滑动解锁的目的就是为了防止别人用代码登录(也就是为了防止你自动化登录),有些滑动解锁是需要去拼图这种会难一点。有些直接拖到最最右侧就可以了,本篇讲下最简单的直接滑动最右侧的滑块解锁。滑动解锁场景看下图,是我本地写的一个slider.html网页 ......
  • win10远程登录提示被锁定
    ......