Apple Login for JavaScript

Apple Login for JavaScript

官方文档:developer.apple.com/documentati...

参数说明

Response type

控制登录后返回的类型,可选是code,id_token等,如果是id_token,下面的response_mode则必须是form_post

Response Mode

控制登录后code/id_token返回方式;

  1. 如果response_typequery则会拼接在下面配置的redirect_uri的后面
  2. 如果response_typeid_token,则需要配置form_post,则会以post方法请求redirect_uri

Client Id

在Apple 开发者账户创建Identifier:

注册成功则Identifier则是Client Id;

Redirect uri

  1. 如果response_typequery则登录获取的code则会拼接在url后面
  2. 如果response_typeid_token,则需要配置form_post,则会以post方法请求返回该url

![编辑](/Users/moki/Library/Application Support/typora-user-images/image-20250331005459622.png)

Scope

向Apple请求的用户信息, 比如name email使用空格分割

JS使用Apple登录(前端部分)

使用url

可以使用拼接的url打开苹果登录页,文档: developer.apple.com/documentati...:

typescript 复制代码
const baseUrl = "https://appleid.apple.com/auth/authorize";
const url = new URL(baseUrl);

url.searchParams.append("response_type", "code"); 
url.searchParams.append("response_mode", "query");
url.searchParams.append("client_id", "xxx");
url.searchParams.append("nonce", "name email");
url.searchParams.append("redirect_uri", "https://xxx.com");

window.open(url.torString(), "_blank");

使用JS SDK

body中引入js文件:

html 复制代码
<body>
        <script 
                type="text/javascript"           src="https://appleid.cdnapple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
        </script>
    </body>

初始化:

js 复制代码
// 参数值同上
AppleID.auth.init({
    clientId : '[CLIENT_ID]',
    scope : '[SCOPES]',
    redirectURI : '[REDIRECT_URI]',
    usePopup : true
});

主动调用登录:

typescript 复制代码
interface SignResponseType {
  authorization: {
    code: string;
    id_token: string;
    state: string;
  },
  user: {
       email: string,
       name: {
         firstName: string,
         lastName: string
       }
     }
}

const onCode = () => {
  try {
    // AppleID是根据上面 body 中导入的 js 挂载
    window.AppleID.auth
      .signIn()
      .then((res: SignResponseType) => {
              console.log("code: ", res?.authorization?.code)
      })
      .catch(console.log);
  }catch(err) {
    // TODO...
  }
}

onCode();

校验Apple Code (后端部分)

该部分以 Node 为例子,处理前端获取到apple code传递给后端进行校验

首选需要登录apple开发者账户创建一个keys:

需要勾选上Sign in with Apple:

记住 keyid和保存证书为xx.p8格式,该证书只能下载一次!

![image-20250331011349189](/Users/moki/Library/Application Support/typora-user-images/image-20250331011349189.png)

使用 apple-signin-auth处理:

typescript 复制代码
import appleSignin from 'apple-signin-auth';


const clientSecret = appleSignin.getClientSecret({
    clientID: 'xxxx', // 与上面创建的 clientID 为同一个
    teamID: 'x x x x', // Appl 开发者账户的 唯一标识符
    privateKey: '', // 该值为上面导出的`xxx.p8`的证书的值,可用文本编辑器打开
    // privateKeyPath: "", // 不想用 privateKey 可以用 该属性代替,表示 xxx.p8 证书的地址
    keyIdentifier: '', // 上面创建 key 的 key Id
    expAfter: 15777000, 
});
const options = {
    clientID: '', // Apple Client ID
    redirectUri: '', // use the same value which you passed to authorisation URL.
    clientSecret: clientSecret
};


// 测试前端的token是否有效
try {
    const tokenResponse = await appleSignin.getAuthorizationToken("x x x", options);

} catch (err) {
    console.error(err);
}
相关推荐
Hilaku37 分钟前
我用 Gemini 3 Pro 手搓了一个并发邮件群发神器(附源码)
前端·javascript·github
IT_陈寒38 分钟前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端
快手技术39 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
颜酱41 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
全栈前端老曹1 小时前
【包管理】npm init 项目名后底层发生了什么的完整逻辑
前端·javascript·npm·node.js·json·包管理·底层原理
HHHHHY1 小时前
mathjs简单实现一个数学计算公式及校验组件
前端·javascript·vue.js
boooooooom1 小时前
Vue3 provide/inject 跨层级通信:最佳实践与避坑指南
前端·vue.js
一颗烂土豆1 小时前
Vue 3 + Three.js 打造轻量级 3D 图表库 —— chart3
前端·vue.js·数据可视化
青莲8431 小时前
Android 动画机制完整详解
android·前端·面试
iReachers1 小时前
HTML打包APK(安卓APP)中下载功能常见问题和详细介绍
前端·javascript·html·html打包apk·网页打包app·下载功能