ios Sign In With Apple PHP服务器验证问题

Sign In With Apple服务器登录验证有很多问题,官方文档写的也不清不楚,网上资料不算多。
一、验证identityToken有效性和正确性
根据官方文档说明,identityToken是一个JWT算法格式,要使用JWT这个库去进行解析,解析完成后进行验证:
(1)Verify the JWS E256 signature using the server’s public key
(2)Verify the nonce for the authentication
(3)Verify that the iss field contains https://appleid.apple.com
(4)Verify that the aud field is the developer’s client_id
(5)Verify that the time is earlier than the exp value of the token
具体验证方法可以参考某个博客的一篇文章,我这边验证identityToken都是参考这篇博客

 try {
        $identityToken = $verifyArray['identityToken'];
        $appleSignInPayload = ASDecoder::getAppleSignInPayload($identityToken);
        $email = $appleSignInPayload->getEmail();
        $user = $appleSignInPayload->getUser();
        $userId = $verifyArray['user'];
        $isValid = $appleSignInPayload->verifyUser($userId);
//        print_r($isValid);
        if (!$isValid){
            if($errDesc ==''){
                $errDesc = 'verify userId fail';
            }
        }
        return $appleSignInPayload;
    }catch (Exception $exception){
//        print_r($exception->getMessage());
        if($errDesc ==''){
            $errDesc = $exception->getMessage();
        }
        return null;
    }

二、authorizationCode验证,生成和刷新token
主要是authorizationCode验证,我很怀疑这个是web Sign In With Apple的时候才需要用到。
具体接口文档

在这里插入图片描述

1.苹果后台创建一个密钥,用于获取我们的 client_secret,这也是从 Apple 发出令牌请求所必需的。
(1) 进入 Certificates, Identifiers & Profiles > Keys,然后单击 Keys 旁边左上角的 + 号。
(2)提供密钥名称并确保勾选 Sign In with Apple。在这里,我们还必须单击 Configure。在接下来出现的Configure Key 面板中,选择我们之前在 Choose a Primary App ID 下使用的 App ID,然后单击“保存”。
(3) 单击 Continue,然后在下一页中验证详细信息并单击 Register。
(4)下载密钥并将其保存在安全的地方,因为您永远无法再次下载密钥。下载密钥后单击 Done。
(5)保存key id和获取开发者账号的TeamID,后面需要使用这两个值。
在这里插入图片描述

在这里插入图片描述

2.生成client_secret,需要使用jwt库,规定生成的JWT最长期限为6个月,你可以手动生成 JWT,但是不能使用firebase/php-jwt这个库,因为这个库缺少支持ES256算法格式,如果使用最后请求https://appleid.apple.com/auth/token这个接口返回的都是"error":"invalid_client",所以使用composer require lcobucci/jwt这个库,具体代码如下:

$payload = array(
        "iss" => "Your Team ID",
        "aud" => "https://appleid.apple.com",
        "iat" => time(),
        "sub" => "Your App Bundle ID",
        "exp" => time()+ 86400*180

    );
    $jwt_header = array(
        'typ' => 'JWT',
        'alg' => 'ES256',
        'kid' => 'The Key ID of the private key',
    );
    $key_path = 'file://D:\apple\AuthKey_keyid.p8';
    $signer = new Lcobucci\JWT\Signer\Ecdsa\Sha256();
    $key = new Lcobucci\JWT\Signer\Key($key_path);
    $builder = new Lcobucci\JWT\Builder();
    $builder->sign($signer, $key);
    foreach($jwt_header as $key => $value)
        $builder->withHeader($key, $value);
    foreach($payload as $key => $value)
        $builder->withClaim($key, $value);
    $jwt_token = $builder->getToken();
//    print_r($authorizationCode);
    $jwt = (string)$jwt_token;

3.生成jwt格式的client_secret后,可以拿去JWT官网解析看看结果
4.生成和刷新token
(1)请求url为POST https://appleid.apple.com/auth/token
(2)生成令牌我们需要传以下几个参数
grant_type:'authorization_code'为获取令牌
client_id:client_id
redirect_uri:redirect_uri
code:上一步获取到的授权码,code
client_secret:一个生成的JWT,如果不了解可自行查阅有关JWT的知识
(3)刷新令牌我们需要传以下参数
grant_type:'refresh_token'为刷新令牌
client_id:client_id
client_secret:client_secret,
refresh_token:上一步获取到的id_token
具体代码如下:

 $appleConfig = array();
    $appleConfig['client_id'] = 'Your App Bundle ID';
    $appleConfig['client_secret'] = $jwt;
    $appleConfig['code'] = $authorizationCode;
    $appleConfig['grant_type'] = 'authorization_code';//authorization_code,refresh_token
    $biliConfig['redirect_uri'] = 'https://example.org';
//    $appleConfig['refresh_token'] = 'rb65c3869af18460fb456fdgfh8.0.nrquq.DWHUDo7YTmZG_wqewwq-w';
    $szUrl = 'https://appleid.apple.com/auth/token';
    $request = new HttpHelper();
    $response = $request->post($szUrl, $appleConfig);

5.响应结果
(1)生成token响应结果:
{"access_token":"xxxxxx","token_type":"Bearer","expires_in":3600,"refresh_token":"xxxxxx","id_token":"xxxxxxx"},其中id_token是一个JWT格式,所以需要再次解析。
(2)刷新token响应结果:
{"access_token":"xxxxxx","token_type":"Bearer","expires_in":3600}
注意:根据官方文档说明“You may verify the refresh token up to once a day to confirm that the user’s Apple ID on that device is still in good standing with Apple’s servers. Apple’s servers may throttle your call if you attempt to verify a user’s Apple ID more than once a day”,说的刷新token一天最多刷新一次,多了可能会限制你的账号,所以最终考虑不使用这个接口进行登录验证。
6.参考文档
(1)Generate and validate tokens
(2)Sign In With Apple 从登陆到服务器验证
(3)Sign in with Apple NODE,web端接入苹果第三方登录
(4)关于Sign in with Apple (Apple 登录) PHP的后端验证
(5)oauth2-apple
(6)what-the-heck-is-sign-in-with-apple
(7)sign-in-with-apple-example
(8)What are we supposed to do with the access_token
(9)Apple Sign-In: Custom Servers and an Expiry Conundrum
(10)快速配置 Sign In with Apple

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342