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

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

本文主要参考:

APP客户端授权登录功能开发不做讲述,主要记录PHP后端如何验证苹果授权登录。

针对后端验证苹果提供了两种验证方式,一种是基于JWT的算法验证,另外一种是基于授权码的验证,本文使用了JWT验证实现。

首先,APP客户端认证成功后会返回ASAuthorizationAppleIDCredential类型的对象,它的主要属性如下:

  • userID:授权的用户唯一标识,在一个开发者账户下的APP获取到的是一样的,类似微信开发API中的openid;
  • email、fullName:授权的用户资料,用户邮箱,昵称等信息;
  • authorizationCode:授权code
  • identityToken:授权用户的JWT凭证,用于验证信息合法性

其次,拿到这些信息,将user,email,fullName,identityToken等信息直接传递给后端,后端对请求进行验证(此处使用identityToken进行JWT验证):

  • identityTokenString实际上是JWT(JSON Web Token)格式的文件,JWT文件由三部分组成:
  1. Header
  2. Payload
  3. Signature

     这三部分由"."分割,其中Header和Payload是经过base64编码的。

{
  "keys": [
    {
      "kty": "RSA",
      "kid": "AIDOPK1",
      "use": "sig",
      "alg": "RS256",
      "n": "lxrwmuYSAsTfn-lUu4goZSXBD9ackM9OJuwUVQHmbZo6GW4Fu_auUdN5zI7Y1dEDfgt7m7QXWbHuMD01HLnD4eRtY-RNwCWdjNfEaY_esUPY3OVMrNDI15Ns13xspWS3q-13kdGv9jHI28P87RvMpjz_JCpQ5IM44oSyRnYtVJO-320SB8E2Bw92pmrenbp67KRUzTEVfGU4-obP5RZ09OxvCr1io4KJvEOjDJuuoClF66AT72WymtoMdwzUmhINjR0XSqK6H0MdWsjw7ysyd_JhmqX5CAaT9Pgi0J8lU_pcl215oANqjy7Ob-VMhug9eGyxAWVfu_1u6QJKePlE-w",
      "e": "AQAB"
    }
  ]
}

kid,为密钥id标识,签名算法采用的是RS256(RSA 256 + SHA 256),kty常量标识使用RSA签名算法,其公钥参数为n和e,其值采用了BASE64编码,使用时需要先解码。

然后引入JWT算法,下面是主要逻辑及验证接口:

    /**
     * 第三方登录
     */
    public function appleIdLogin()
    {
        $openid = $this->params('userID', '');
        $verifyToken = $this->params('verifyToken', '');

        if(empty($openid) || empty($verifyToken)){
            $this->responseJson(1, '参数错误', array(), true);
        }

        //token校验
        $verifyRes = $this->appleJwtVerify($verifyToken);
        if(isset($verifyRes['jwtStatus']) && $verifyRes['jwtStatus'] == 'failed'){
             $this->responseJson(1, $verifyRes['jwtMsg'], array(), true);
             return;
        }else{
            //进行注册
            $res = $this->register('appleID', $openid);
        }
    }

    /**
     * AppleID登录JWT校验identityToken
     * 解析后的identityToken由三部分组成:Header.Payload.Signature
     *
     * @param string $identityToken
     * @return object
     * @throws \Exception
     */
    private function appleJwtVerify($identityToken = ''){        
        //获取Apple公钥访问地址:https://appleid.apple.com/auth/keys
        //得到Apple公钥:
        //{
        //    "kty": "RSA",
        //    "kid": "AIDOPK1",
        //    "use": "sig",
        //    "alg": "RS256",
        //    "n": "lxrwmuYSAsTfn-lUu4goZSXBD9ackM9OJuwUVQHmbZo6GW4Fu_auUdN5zI7Y1dEDfgt7m7QXWbHuMD01HLnD4eRtY-RNwCWdjNfEaY_esUPY3OVMrNDI15Ns13xspWS3q-13kdGv9jHI28P87RvMpjz_JCpQ5IM44oSyRnYtVJO-320SB8E2Bw92pmrenbp67KRUzTEVfGU4-obP5RZ09OxvCr1io4KJvEOjDJuuoClF66AT72WymtoMdwzUmhINjR0XSqK6H0MdWsjw7ysyd_JhmqX5CAaT9Pgi0J8lU_pcl215oANqjy7Ob-VMhug9eGyxAWVfu_1u6QJKePlE-w",
        //    "e": "AQAB"
        //}
        
        //通过Apple公钥在线(https://8gwifi.org/jwkconvertfunctions.jsp)得到用于解密的pem公钥字符串
        $publickKey = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlxrwmuYSAsTfn+lUu4go
ZSXBD9ackM9OJuwUVQHmbZo6GW4Fu/auUdN5zI7Y1dEDfgt7m7QXWbHuMD01HLnD
4eRtY+RNwCWdjNfEaY/esUPY3OVMrNDI15Ns13xspWS3q+13kdGv9jHI28P87RvM
pjz/JCpQ5IM44oSyRnYtVJO+320SB8E2Bw92pmrenbp67KRUzTEVfGU4+obP5RZ0
9OxvCr1io4KJvEOjDJuuoClF66AT72WymtoMdwzUmhINjR0XSqK6H0MdWsjw7ysy
d/JhmqX5CAaT9Pgi0J8lU/pcl215oANqjy7Ob+VMhug9eGyxAWVfu/1u6QJKePlE
+wIDAQAB
-----END PUBLIC KEY-----";//pem公钥 【也可以通过将RSA公钥modulus(N)和exponent(E)转换为PEM文件】
        
        $decoded = JWT::decode($identityToken, $publickKey, array('RS256'));
        return $decoded;
    }

    /**
     * 第三方登录账号注册
     *
     * @param string $regType 注册类型
     * @param string $openid 账户唯一识别
     * @throws \Blim\Exception\Stop
     */
    public function register($regType = '', $openid = ''){
        if(empty($regType) || empty($openid)){
            $this->responseJson(1, '注册失败', array(), true);
        }else{
            //注册逻辑
        }
    }

    /**
     * json输出
     * @param $code
     * @param string $message
     * @param array $exts
     * @param bool $hasData
     * @throws Stop
     */
    public function responseJson($code, $message = '', $exts = array(), $hasData = false)
    {
        $res = array('code' => $code, 'tips' => $message, 'msg' => $message);
        $res['data'] = array();
        if (!empty($exts)) {
            $res['data'] = $exts;
        }
        app('response')->withJson($res, 200);
        app()->stop();
    }

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity3D是一款流行的跨平台游戏开发引擎,支持多种移动平台和操作系统。最近,苹果推出了“Sign in with Apple”功能,该功能允许用户使用其Apple ID登录第三方应用程序。 要在Unity3D中接入“Sign in with Apple”功能,需要遵循以下步骤: 1. 首先,确保你的Unity3D版本是最新的,以便能够支持最新的API和功能。 2. 在苹果开发者平台上创建一个新的App ID,并将其与你的Unity3D项目关联。确保在App ID设置中启用“Sign in with Apple”功能。 3. 在Unity3D中,编写代码以实现与苹果登录服务通信的逻辑。你需要使用Unity内置的网络API,通过发送HTTP请求和接收回复来实现与苹果服务器的通信。 4. 在Unity3D项目中创建一个用户界面,允许用户点击“Sign in with Apple”按钮。当用户点击这个按钮时,你的代码将向苹果服务器发送请求,获取用户的验证凭证。 5. 将从苹果服务器接收到的验证凭证与你的后端服务器通信。你的后端服务器需要验证这个凭证的有效性,并通过向苹果服务器发送请求获得用户的基本信息。 6. 在Unity3D中使用这些用户信息,例如显示用户的用户名、头像等。 需要注意的是,为了保护用户的隐私,苹果有一些要求和限制,开发人员需要遵守这些规定,例如要求提供“其他登录选项”以及对于用户与苹果登录服务的数据处理等。 总结:要在Unity3D中接入“Sign in with Apple”功能,你需要使用最新版本的Unity3D、遵循苹果开发者平台的规定、实现与苹果服务器的通信逻辑、创建用户界面、验证凭证、获取用户信息,并遵守苹果的隐私规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值