IOS苹果登录sign in with apple后端校验
最近新开发的app在IOS平台app store connent提审的时候,被拒了,原因是app上如果有接第三方登陆(比如微信,微博,facebook等),那就必须要接apple id登陆,坑爹~苹果霸权啊!然而没办法,所以只能接入苹果登录。
APP端的接入可以看上一篇博客:iOS苹果授权登录(Sign in with Apple)/Apple登录/苹果登录集成教程,下面我来说一下对接苹果登陆的后端验证模块。
这里先说一下apple id登陆的主要流程和涉及到的一些知识点。首先apple登陆的时序图如下:
先是app和苹果服务器通信获得identitytoken,然后把identitytoken交给业务后台验证,验证通过就可以了。其中appServer涉及到的验证,就是identitytoken,其实identitytoken就是一个jws,至于校验jws,其实是有现成的jar包可以实现,验证jws的签名,保证数据没有被篡改之后,还要校验从identitytokendecode出来的nonce,iss,aud,exp,主要是iss和exp这两个。下面我直接上代码:
一、苹果登录JAVA后台校验:JWT的identityToken验证模式
话不多说直接上代码:
1、app端请求appleServer返回的identityToken
"identityToken":"ZXlKcmFXUWlPaUpsV0dGMWJtMU1JaXdpUndje***xMXpZZ3BiYWRIWHdGVEtR4ejRPZTBhUkdtcHZOZFpWVkJGQjN4OU13"
就是一个JWT的token
2、有2次验证,分别调取apple提供的接口即可
private final String APPLE_AUTH_URL = "https://appleid.apple.com/auth/keys";
private final String ISS = "https://appleid.apple.com";
一次是利用token获取解密的publicKey;另一次就是再校验这个publicKey。
代码如下:
public boolean verify(AppleLoginVO appleLoginVO) {
//这里传过来的identityToken应该是三个.分割,解密之后
String identityToken = appleLoginVO.getIdentityToken();
try {
if (identityToken.split("\\.").length 1){
String firstDate = new String( Base64.decodeBase64(identityToken.split("\\.")[0]),"UTF-8");
String claim = new String(Base64.decodeBase64(identityToken.split("\\.")[1]), "UTF-8");
String kid = JSONObject.