iOS13 中,如果 App 提供第三方登录,就必须添加 苹果登录 Sign in with Apple 选项,并要求所有开发者于 2020年4月之前 完成现有应用的更新,否则审核不给通过。

iOS 苹果授权登录(Sign in with Apple)系列之Apple Developer配置篇

iOS 苹果授权登录(Sign in with Apple)系列之原生篇

iOS 苹果授权登录(Sign in with Apple)系列之uniapp篇

iOS 苹果授权登录(Sign in with Apple)系列之服务端篇

例子是基于 PHPLaravel 框架进行开发,Java 平台可以参考 https://blog.csdn.net/wpf199402076118/article/details/99677412

苹果提供了两种验证方式,一种是基于 JWT 的算法验证,另外一种是基于 授权码 的验证,这里再提供第三种“取巧”的验证方式即“不验证模式”。

不验证模式

后端只需要接收App端提交的以下参数(useremail 为Apple返回给App的参数名)

user: 授权的用户唯一标识,该值在同一个开发者账号下的所有 App 下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来

email: 邮箱,只有第一次 授权苹果才会给 App 返回邮箱信息,之后登录不再返回

fullName: 用户信息,只有第一次 授权苹果才会给 App 返回用户信息,之后登录不再返回

开发者只要判断 数据库 是否存在 user(授权的用户唯一标识) 存在就返回登录成功信息,不存在即在数据库插入 useremailfullName等信息(业务逻辑根据具体需求调整)

教程到此结束,后面不用看了

验证模式

苹果授权登录(Sign in with Apple)后端验证
基于 JWT 的验证

Sign in with Apple 后端 JWT 验证文档:
https://developer.apple.com/documentation/signinwithapplerestapi/fetch_apple_s_public_key_for_verifying_token_signature

食用指南
后端只需要接收 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);
}
基于授权码的验证

Sign in with Apple 后端 授权码 验证文档:
https://developer.apple.com/documentation/signinwithapplerestapi/generate_and_validate_tokens

其中 isskid 的获取方式

跑不通不知道哪里错了,等研究出来再更新

{
    "error": "invalid_client"
}

Demo

https://github.com/quanweiwang/sign-in-with-apple-server