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

news/2024/10/23 7:22:38/

苹果授权登录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


http://www.ppmy.cn/news/625394.html

相关文章

【1081】分苹果

1081&#xff1a;分苹果 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 30677 通过数: 26393 【题目描述】 把一堆苹果分给n个小朋友&#xff0c;要使每个人都能拿到苹果&#xff0c;而且每个人拿到的苹果数都不同的话&#xff0c;这堆苹果至少应该有多少个&…

中国人民大学与加拿大女王大学金融硕士——在职读研打造更加精彩的人生

人生的奇妙在于它永不停息的变化。在完善自我的旅程中&#xff0c;我们需要保持学习和成长&#xff0c;深耕自己的熟悉的领域&#xff0c;成为这个领域的专家。人生所有的惊艳绽放&#xff0c;都是厚积薄发、化茧成蝶。都是我们长期默默努力的结果&#xff0c;V17310962071 在中…

力扣题库刷题笔记18--四数之和

1、题目如下&#xff1a; 2、个人Python代码实现&#xff1a; 首先看到这题就会想到两种方式&#xff0c;一是四层循环暴力破解&#xff0c;二就是基于前面的三数之和外面加加一层嵌套。 先看一下暴力破解&#xff1a; 这里可以看到&#xff0c;当数据量足够大时&#xff0c;依…

HttpRunner自动化工具之YAML文件简介

yaml文件简介&#xff1a; Yet Another Markup Language &#xff1a;另一种标记语言。yaml 是专门用来写配置文件的语言&#xff0c;非常简洁和强大,更直观&#xff0c;更方便&#xff0c;有点类似于json格式。 在自动化测试框架中&#xff0c;常应用于自动化测试过程&#xf…

Docker部署Minio

1、拉去minio镜像 docker pull minio/minio:latest2、运行以下命令部署minio&#xff1a; sudo docker run -p 9000:9000 -p 9001:9001 \-d --restartalways --userroot --privilegedtrue \-e "MINIO_ROOT_USERadmin" \-e "MINIO_ROOT_PASSWORDminio2023!&…

PC Windows Win11 Win10 微信打字卡顿问题解决

之前一直觉得微信聊天输入框 打字卡顿是电脑配置不行 直到换了 I7-10700K 任然很卡 而且试过其他软件一切正常 后面在网上找到相应配置解决卡顿问题 如下&#xff1a; 1、鼠标右击微信属性 --> 兼容性 --> 更改高SPI设置 2、勾选下图两项配置 确定 --> 确定后重启…

Win7环境Word 2013编辑文档慢、卡顿的解决方法

原帖&#xff1a;Win7环境Word 2013编辑文档慢、卡顿的解决方法 a. 禁用"硬件加速"&#xff1a; word选项--高级--显示--禁用硬件图形加速&#xff0c;把这个选中试试 b. 禁用‘子像素定位平滑屏幕上的字体’&#xff1a; word选项--高级--显示--使用子像素定位…

数值优化简介

数值优化这个名字来源于一本书&#xff0c;名为《Numerical Optimization》。 Numerical Optimization这两个单词传递了两个知识领域的概念&#xff1a; Optimization指的是数学概念上的优化&#xff0c;即求最优解&#xff0c;也可以理解为求函数的最小值的解&#xff1b; Num…