苹果授权登录,后端校验(Sign in with Apple)

接入苹果第三方登录流程记录

在网上找到一个中文版的流程图:
在这里插入图片描述

我的思路

  1. app端传入identityToken,解析获取header和paylod

identityToken 是一个 Json Web Token (JWT)。它由点号 (“.”) 分割为三部分:header、payload、signature。前两部分是两个 Json 字符串经过 base64Url 编码的结果。第三部分是前面二者加密后再做 base64Url 编码得到的。

  1. 获取苹果的公钥,链接: https://appleid.apple.com/auth/keys,会得到有个jsonArray数组,如图:
    一般返回3个数据
  2. 使用第一步从header中解析出来的"kid"去匹配苹果公钥
  3. 通过苹果公钥中的"n"和"e"生成解析identityToken的签名秘钥
  4. 解析成功说明鉴权成功,返回解析出来的苹果唯一id; 反之则不然

此处我在解析时,从解析出来的结果中的"aud:bundle id苹果打包名"做了一次匹配,也可以不这么做

代码实例

我将鉴权方法做成一个工具类,可以直接复制代码调用,此处代码需要maven依赖 jjwthutool工具类 ,不知道的可以到网上去找下依赖
下面代码中出现的TKServiceException类是自定义的异常类,可以替换


import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xiyakj.xiyakj.common.core.exception.TKServiceException;
import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;

import java.math.BigInteger;
import java.security.PublicKey;
### 集成 Apple 登录到 UniApp 应用 为了在 UniApp 中集成 Apple 登录功能,开发者需遵循特定的配置和编码实践。自 HBuilderX 2.4.7+ 版本起已支持 Sign in with Apple 功能[^1]。 #### 准备工作 确保应用程序满足以下条件: - 应用程序目标版本为 iOS 13 或更高。 - 已经注册了 Apple Developer Program 并创建了一个启用了 Sign In With Apple 的服务 ID。 - 在 Xcode 和 App Store Connect 上正确设置了应用的相关权限和服务。 #### 实现步骤 ##### 初始化登录请求 通过调用 `uni.login` 方法并指定参数 `provider: 'apple'` 来发起苹果登录请求。此操作会触发用户的认证过程,并返回一个包含临时凭证的对象给回调函数处理。 ```javascript // 发起苹果登录请求 getApple() { uni.login({ provider: 'apple', success: function(loginRes) { // 成功获取到了授权码等信息 console.log('Login Success:', loginRes); // 继续获取用户资料... getUserProfile(); }, fail: function(err) { // 处理错误情况 console.error('Login Failed:', err); uni.showModal({title: "登录失败"}); } }); } ``` ##### 获取用户个人信息 一旦获得了成功的响应,则可以继续向服务器发送进一步的信息查询请求来获得更详细的用户数据,如全名、邮箱地址(如果用户同意分享的话)。注意这里涉及到隐私保护政策下的敏感字段读取许可问题。 ```javascript function getUserProfile(){ uni.getUserInfo({ provider: 'apple', success: function(res){ const userInfo = res.userInfo; let data = { openId :userInfo.openId, fullName :userInfo.fullName || '', authorizationCode :userInfo.authorizationCode, identityToken :userInfo.identityToken, realUserStatus :userInfo.realUserStatus }; submitToServer(data); // 将收集的数据提交至后台验证 }, fail: function(err){ console.error('Failed to get user info:', err); } }) } ``` ##### 后台验证与账户关联 最后一步是在服务器端完成身份令牌的身份验证以及新旧账号之间的绑定逻辑。这通常涉及将前端传来的 token 提交给 Apple API 进行校验,并依据结果决定是否允许访问资源或是创建新的用户记录。 ```python def verify_token(token): # 使用官方提供的库或接口去检验来自客户端传递过来的身份token的有效性和真实性 pass def bind_account(apple_id, local_user_info): # 如果该 apple id 对应的新用户则新建一条记录;如果是老用户就更新其最新状态或其他相关信息 pass ``` 以上就是整个流程的大致描述,在实际开发过程中还需要考虑更多细节上的优化和完善措施以提高用户体验度和安全性保障水平。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值