在 iOS13 中,如果 App 提供第三方登录,就必须添加 苹果登录 Sign in with Apple 选项,并要求所有开发者于 2020年4月之前 完成现有应用的更新,否则审核不给通过。
苹果提供了两种验证方式,一种是基于 JWT 的算法验证,另外一种是基于 授权码 的验证,这里再提供第三种“取巧”的验证方式即“不验证模式”。
不验证模式
后端只需要接收App端提交的以下参数(user、email 为Apple返回给App的参数名)
user: 授权的用户唯一标识,该值在同一个开发者账号下的所有 App 下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来
email: 邮箱,只有第一次 授权苹果才会给 App 返回邮箱信息,之后登录不再返回
fullName: 用户信息,只有第一次 授权苹果才会给 App 返回用户信息,之后登录不再返回
开发者只要判断 数据库 是否存在 user(授权的用户唯一标识) 存在就返回登录成功信息,不存在即在数据库插入 user、email、fullName等信息(业务逻辑根据具体需求调整)
教程到此结束,后面不用看了
验证模式
苹果授权登录(Sign in with Apple)后端验证
基于 JWT 的验证
食用指南
后端只需要接收 App 端提交的以下参数(user、email 为Apple返回给App的参数名)
userID: 授权的用户唯一标识,该值在同一个开发者账号下的所有 App 下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来
email: 邮箱,只有第一次 授权苹果才会给 App 返回邮箱信息,之后登录不再返回
fullName: 用户信息,只有第一次 授权苹果才会给 App 返回用户信息,之后登录不再返回
authorizationCode: 授权 code(没用到)
identityToken: 授权用户的 JWT 凭证
如何验证
1、安装 php-apple-signin 库
composer require griffinledingham/php-apple-signin
需要 php7.2 及以上版本,如果低于该版本,自行修改源码,源码地址
https://github.com/GriffinLedingham/php-apple-signin
2、验证 JWT
public function jwtApple(Request $request) {
// 授权的用户唯一标识
$user = $request->input('user');
// 邮箱
$email = $request->input('email');
// 用户信息
$fullName = $request->input('fullName');
// 授权code 并没有用到
$authorizationCode = $request->input('authorizationCode');
// 授权用户的JWT凭证
$identityToken = $request->input('identityToken');
$appleSignInPayload = ASDecoder::getAppleSignInPayload($identityToken);
$isValid = $appleSignInPayload->verifyUser($user);
// 当 $isValid 为 true 时验证通过,后续逻辑根据需求编写
dd($isValid);
}
基于授权码的验证
其中 iss 和 kid 的获取方式

跑不通不知道哪里错了,等研究出来再更新
{
"error": "invalid_client"
}
Demo