苹果授权登录Sign In With Apple后台代码实现JAVA版本亲测通过版

废话不多说,直接复制把自己的包名写上就可以用了
有个别的小坑,HttpUtil自己写,没附上
Base64一定要用org.apache.commons.codec.binary.Base64其它的会报错
小提示:苹果的公钥可能是固定的,可以自己实现一个缓存提高授权速度

pom.xml

 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
package com.;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.haojiao.init.utils.HttpUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Base64Utils;import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.RSAPublicKeySpec;
import java.util.HashMap;public class SignInWithApple {private static Logger logger = LoggerFactory.getLogger(SignInWithApple.class);@Testpublic void main(){verify("1.2.3");}/*** 解密个人信息** @param identityToken APP获取的identityToken** @return 解密参数:失败返回null  sub就是用户id,用户昵称需要前端传过来*/public static JSONObject verify(String identityToken) {try {String[] identityTokens = identityToken.split("\\.");String token0 = new String(Base64Utils.decodeFromString(identityTokens[0]), "UTF-8");String token1 = new String(Base64Utils.decodeFromString(identityTokens[1]), "UTF-8");JSONObject data0 = JSONObject.parseObject(token0);JSONObject data1 = JSONObject.parseObject(token1);String aud = (String) data1.get("aud");String sub = (String) data1.get("sub");if (verify(data0,identityToken, aud, sub)) {return data1;}} catch (Exception e) {logger.info("verify(*) error ",e);}return null;}/*** 验证** @param identityToken APP获取的identityToken* @param aud           您在您的Apple Developer帐户中的client_id* @param sub           用户的唯一标识符对应APP获取到的:user* @return true/false*/private static boolean verify(JSONObject token0,String identityToken, String aud, String sub) {try {PublicKey publicKey = getPublicKey(token0);if (publicKey==null){return false;}JwtParser jwtParser = Jwts.parser().setSigningKey(publicKey);jwtParser.requireIssuer("https://appleid.apple.com");jwtParser.requireAudience(aud);jwtParser.requireSubject(sub);Jws<Claims> claim = jwtParser.parseClaimsJws(identityToken);if (claim != null && claim.getBody().containsKey("auth_time")) {return true;}} catch (Exception e) {logger.info("verify(*,*,*) error ", e);}return false;}private static PublicKey getPublicKey(JSONObject token0) {try {String str = HttpUtil.get("https://appleid.apple.com/auth/keys", new HashMap<>());JSONObject data = JSONObject.parseObject(str);JSONArray jsonArray = data.getJSONArray("keys");for (int i = 0; i <jsonArray.size() ; i++) {JSONObject o = jsonArray.getJSONObject(i);String kid = o.getString("kid");if (kid.equals(token0.getString("kid"))){String n = o.getString("n");String e = o.getString("e");BigInteger modulus = new BigInteger(1, Base64.decodeBase64(n));BigInteger publicExponent = new BigInteger(1, Base64.decodeBase64(e));RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, publicExponent);KeyFactory kf = KeyFactory.getInstance("RSA");return kf.generatePublic(spec);}}} catch (Exception e) {logger.info("getPublicKey error ", e);}return null;}}

打个广告,是好人就用微信扫一下,额度大,利息低,按天收~

请勿转载:来自
CSDN

苹果授权登录Sign In With Apple亲测通过版[100%成功]相关推荐

  1. ios 登录 java 后台,IOS苹果登录sign in with apple后端校验

    IOS苹果登录sign in with apple后端校验 最近新开发的app在IOS平台app store connent提审的时候,被拒了,原因是app上如果有接第三方登陆(比如微信,微博,fac ...

  2. Apple Sign in with Apple(苹果授权登录PHP)

    Apple Sign in with Apple(苹果授权登录PHP) 文章目录 Apple Sign in with Apple(苹果授权登录PHP) 一.登录Apple Developer 二.创 ...

  3. Sign in With Apple (苹果授权登录)

    Sign in With Apple (苹果授权登录) 关于Sign in With Apple (苹果授权登录)的问题,公司app上架appStore被拒原因是使用第三方授权登陆但是却没有使用苹果账 ...

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

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

  5. iOS 苹果授权登录(Sign in with Apple)系列之Apple Developer配置篇

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

  6. php Sign in with Apple(苹果授权登录PHP后端接口)

    详细配置参考:https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple 本文主要参考: https: ...

  7. iOS 苹果登录 Sign in with apple Swift

    iOS 苹果登录 Sign in with apple Swift 话不多说,直接看功能类,解释代码里有 import UIKit import AuthenticationServices @ava ...

  8. Java Apple_GitHub - izhaorui/AppleLogin-java: 苹果登录 Sign in with Apple 服务端校验

    APP端苹果登录java后端校验 主要校验苹果授权登录token 是否正确 主要方法 public RSAPublicKeySpec build(final String n, final Strin ...

  9. 【JAVA】对接苹果授权登录流程

    背景 苹果公司要求所有使用第三方登录的 App,都必须接入Sign in with Apple. 接入方式 基于JWT identityToken的算法验证 基于授权码的验证 校验流程 上图为苹果对接 ...

最新文章

  1. POJ 2528 Mayor's posters(线段树)
  2. nstimer循环引用_NSTimer定时器进阶——详细介绍,循环引用分析与解决
  3. Jmeter自定义函数和引入外部文件的几种方法
  4. 自己写的一个简单的购物车的登录购买
  5. spark.mllib:bagging方法
  6. Opportunity retrieval in SalesPipeline
  7. 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C内存多大
  8. *【CodeForces - 195B】After Training (多解,模拟)
  9. golang日志输出
  10. Netty(三) 什么是 TCP 拆、粘包?如何解决?
  11. HDU 4379 水题,大水,但我WA了很多次,做了很久
  12. 深度学习自学(三十七):基于用户自定义要求3D房间自动设计研究
  13. 我的Java开发学习之旅------Java经典排序算法之冒泡排序
  14. 深度学习——卷积神经网络(CNN)
  15. C++实现化学方程式配平
  16. python erp操作_谈OpenERP部署环境操作步骤
  17. 高中数学集合知识点小题解题方法
  18. java+epub+阅读器_java – 转到epub阅读器页面(PageTurner)
  19. linux动态监控系统
  20. 华为HarmonyOS鸿蒙2.0系统安装谷歌框架play商店GMS,mate30/40系列,p40,p50,nova5 6 7 8,荣耀30/40/50/magic3/9x

热门文章

  1. 鸿蒙到底是不是安卓?
  2. 互联网快讯:微信上线“仅传输文件”新功能;极米RS Pro 2获用户肯定;网宿科技与奇安信达成战略合作
  3. Fibonacci Sum(二项式求和)
  4. 利用差分求非齐次多项式的通项公式
  5. 张峥、小白谈GPT与人工智能:可能是好事,也可能不是
  6. 【python】求两条直线的交点
  7. 【实践与问题解决28】最全超分辨率(SR)数据集介绍以及多方法下载链接
  8. 原来 SQL 中的 NULL 是这么回事儿
  9. 【Hibernate步步为营】--映射合集汇总
  10. 1129 - 喵哈哈村的战斗魔法师丶坏坏い月 线段树