背景:公司app项目有一个苹果账号三方登录功能,其中需要后台提供苹果验证。按照网上搜到的方法,有时候会匹配不成功,将ios请求的内容存到redis里面,redis设置4分钟过期。

下面是代码,直接复制过去应该要修改的,先看懂啥意思自己在修改吧。里面的参数jwt是app端传来的。里面的从redis存取的方法应该不能直接用,写成你自己的方法,也可以直接去掉,去掉有可能会验证不通过。我个人觉得应该是后台请求的信息和app反过来的信息时间上有可能不同步,就会验证不通过,所以通过redis保存一下4分钟。据说是这个token5分钟过期。

package com.jeecg.wechat.controlle;
import java.security.PublicKey;import javax.servlet.http.HttpServletRequest;import org.apache.commons.net.util.Base64;
import org.jeecgframework.core.common.service.impl.RedisService;
import org.jeecgframework.core.util.HttpRequest;
import org.jeecgframework.core.util.oConvertUtils;
import org.jeecgframework.jwt.util.ResponseMessage;
import org.jeecgframework.jwt.util.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.auth0.jwk.InvalidPublicKeyException;
import com.auth0.jwk.Jwk;
import com.jeecg.share.util.RedisConfig;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;/**ios  appleid三方登录后台验证方法* 参考:https://blog.csdn.net/wth905541529/article/details/103312174* @author Administrator**/
@Controller
@RequestMapping("/IosController")
public class IosController {private static final Logger log = LoggerFactory.getLogger(IosController.class);@Autowiredprivate RedisService redisService;/*** 第一步:手机端操作获取code* 第二步:通过code获取access_token(在自己服务器端做)* @return*/@RequestMapping(value = "/appleAuth",method = RequestMethod.GET)@ResponseBodypublic Object appleAuth(String jwt) {//从redis里面取jwtif (jwt.split("\\.").length > 1) {String claim = new String(Base64.decodeBase64(jwt.split("\\.")[1]));String aud = JSONObject.parseObject(claim).get("aud").toString();String sub = JSONObject.parseObject(claim).get("sub").toString();    //用户openidif (oConvertUtils.isNotEmpty(redisService.get(sub))) {jwt = redisService.get(sub) + "";}}JSONObject jsonObject = null;jsonObject = HttpRequest.sendGet("https://appleid.apple.com/auth/keys", "");if(oConvertUtils.isEmpty(jsonObject)){return Result.error("网络故障,请重试!");// 未获取到公钥}String keys = jsonObject.getString("keys");JSONArray arr = JSONObject.parseArray(keys);JSONObject jsonObject1 = JSONObject.parseObject(arr.getString(0));Jwk jwa = Jwk.fromValues(jsonObject1);try {// 生成苹果公钥PublicKey publicKey = jwa.getPublicKey();
//            String hearder = new String(Base64.decodeBase64(jwt.split("\\.")[0]));if (jwt.split("\\.").length > 1) {String claim = new String(Base64.decodeBase64(jwt.split("\\.")[1]));String aud = JSONObject.parseObject(claim).get("aud").toString();String sub = JSONObject.parseObject(claim).get("sub").toString();return verify(publicKey, jwt, aud, sub);}//return "FAIL";return Result.error("FAIL");} catch (InvalidPublicKeyException e) {// throw new Exception("转换苹果公钥失败", e);return Result.error("转换苹果公钥失败,请重试!");}}/*** 验证苹果公钥* @param key* @param jwt* @param audience* @param subject* @return*/public Object verify(PublicKey key, String jwt, String audience, String subject) {JwtParser jwtParser = Jwts.parser().setSigningKey(key);jwtParser.requireIssuer("https://appleid.apple.com");jwtParser.requireAudience(audience);jwtParser.requireSubject(subject);try {Jws<Claims> claim = jwtParser.parseClaimsJws(jwt);if (claim != null && claim.getBody().containsKey("auth_time")) {//System.out.println("【成功:】  【key】:"+key+" 【jwt】:"+jwt+" 【audience】:"+audience+" 【subject】:"+subject+" 【claim】:"+claim);if (redisService.get(subject) == null) {redisService.set(subject, jwt);}return Result.success();}return Result.error("FAIL");} catch (ExpiredJwtException e) {//throw new SysException("苹果token过期", e);redisService.delete(subject);e.printStackTrace();  return Result.error("苹果token过期,请重试!");} catch (Exception e) {//throw new SysException("苹果token非法", e);e.printStackTrace();  //System.out.println("【失败:】  【key】:"+key+" 【jwt】:"+jwt+" 【audience】:"+audience+" 【subject】:"+subject+" 【claim】:");return Result.error("苹果token非法,请重试!");}}
}

IOS苹果账号三方登录服务器端验证相关推荐

  1. 苹果官网php,苹果官方购买产品服务器端验证代码PHP版

    苹果官方购买产品服务器端验证代码PHP版 function getReceiptData($receipt, $isSandbox=false) { if($isSandbox){ $endpoint ...

  2. 苹果申请新专利:多个苹果账号可登录同一台苹果设备

    最近的一个新专利显示Apple正在开发允许一个设备登入多个AppleID的新功能.而此功能亦表示多人共用一部iPhone或iPad时,将可以设置多个密​​码.FaceID等. 对Apple产品用家来说 ...

  3. php 苹果支付验证,IOS苹果内购 PHP后端验证票据

    大体流程: 1.IOS端需要在iTunes Connect上面添加配置一些内购商品,并审核通过,每个内购商品有自己的唯一标识product_id. 2.PHP后端要有一套与之对应的内购商品.IOS应用 ...

  4. IOS苹果内购 PHP后端验证票据

    大体流程: 1.IOS端需要在iTunes Connect上面添加配置一些内购商品,并审核通过,每个内购商品有自己的唯一标识product_id. 2.PHP后端要有一套与之对应的内购商品.IOS应用 ...

  5. 如何续费iOS开发者账号 - 详细步骤

    iOS开发者账号在到期前一个月即可进行续费.如果到期未续费,应用程序将被下架,无法在App Store中搜索到.以下是续费的详细步骤: 登录苹果开发者中心 在账号到期前,登录苹果开发者中心,检查是否需 ...

  6. ios开发者账号到期了如何续费(详细步骤)

    ​ 添加图片注释,不超过 140 字(可选) iOS开发者账号在到期的前一个月即可续费,如果到期没有续费APP将会下架,在App Store无法搜索 1.登录苹果开发者中心 ​ 编辑 添加图片注释,不 ...

  7. 近期苹果账号密集被盗:支付宝等成盗刷重灾区 受害者追偿困难

    近期消费投诉网站聚投诉上出现了大量关于苹果账号(Apple ID)被盗后,支付宝.蚂蚁花呗和微信支付等被盗刷的投诉.投诉时间大多集中在5月下旬,盗刷金额一般为数千元. 聚投诉方面提供给<华夏时报 ...

  8. Sign In with Apple - 使用苹果账号登录你的应用

    编辑:老峰,作者:KANGZUBIN 来源:小专栏<WWDC19 内参> 苹果在 9 月 12 号更新了审核指南,加入 4.8 Sign in with Apple 一条,要求所有使用 第 ...

  9. 苹果apple账号授权登录第三方APP

    Apple官方文档 前言:由于公司最近有个业务需求是要进行Apple账号授权登录,于是我看边看文档边借鉴其他人的写法,发现好多文章都有一个共性,一个是在解析JWT的时候自己设置参数后进行判断,这样做没 ...

  10. iOS 苹果授权登录(Sign in with Apple)

    在 iOS13 中,如果 App 提供第三方登录,就必须添加 苹果登录 Sign in with Apple 选项,并要求所有开发者于 2020年4月之前 完成现有应用的更新,否则审核不给通过. iO ...

最新文章

  1. oauth2_带有Spring Security的OAuth 2.0快速指南
  2. python tensorflow教程推荐_TensorFlow教程和文章推荐大全 -DZone AI
  3. 海南大学计算机调剂要求,海南大学2020年硕士研究生招生调剂的公告
  4. fast rcnn 论文解读(附代码链接)
  5. conformal mapping的理解
  6. currenthashmap扩容原理_HashMap 深入解析(二)
  7. Linux(centos7)共享文件
  8. LabView---双通道示波器(内含信号发生器)
  9. 谷歌livereload插件使用
  10. 邯郸市计算机中专学校地址,邯郸蓝天信息工程中专学校
  11. IP切换器是做什么用的?
  12. code 128 字体扫描不可识别
  13. Joson的简单用法
  14. 神经网络拓扑图怎么画,神经网络和图神经网络
  15. 2010年3月份中国物流与采购联合会发布中国制造业采购经理指数为55.1%
  16. tomcat部署静态html网站方法
  17. Fping的基本使用
  18. 运行jar包出现问题:java.lang.SecurityException: JCE cannot authenticate the provider BC
  19. 求三个数的和及平均值简单
  20. OpenCV 进行透视变换

热门文章

  1. Unity Texture2D的裁剪、镜像、翻转、缩放、合并、分辨率
  2. matlab突然打不开,点击运行没有任何反应
  3. mysql 对象名无效_数据库 表 对象名无效
  4. 罗马数字转换 java_JAVA 罗马数字转换成公历年
  5. 把Excel批注的“红三角”放在单元格左上角_excel批注的玩法,看看你会几个
  6. 推荐几款免费的MacOS/MacBook pro/MacBook air读取NTFS格式磁盘软件(完全免费)
  7. 用javascript访问操作iframe中的dom对象
  8. 无限的可能的投资回报率
  9. 第一台计算机英语句子,20个虚拟语气句子带翻译
  10. oracle wish as,虚拟语气:wish、if only和as if的用法