# 接入 Sign in with Apple

# 准备工作

你一共需要准备以下内容:

  1. Apple Developer (opens new window) 注册一个开发者账号。
  2. 在 Apple Developer Portal 注册你的 iOS 应用,请记录下以下的 ID 和 Key:Bundle ID, Apple Team ID, Key ID, Signing Key,之后你需要填入 Authing 控制台表单。
  3. 在 Authing 控制台配置 Sign in with Apple 社会化连接

# 在 Authing 控制台配置 Sign in with Apple 社会化连接

在 Authing 控制台 连接身份源 -> 社会化登录 页面找到 移动端登录 中的 Sign in with Apple:

请分别填入 Bundle ID, Apple Team ID, Key IDSigning Key:

点击 保存 按钮。

# 使用代码接入

在这里我们推荐阅读 Apple 提供的官方指引:Implementing User Authentication with Sign in with Apple (opens new window),下载示例 Demo 程序:

请确保 Bundle ID 和你在 Apple Developer (opens new window) 中创建的应用 Bundle ID (详情请见: 在 Apple Developer Portal 注册你的 iOS 应用)一致:

# 获取 authorizationCode

修改 LoginViewController.swift 中的 authorizationController 方法,你可以在 appleIDCredential 中获取到 authorizationCode,使用该 authorizationCode 可以换取用户信息:

if let authorizationCode = String(bytes: appleIDCredential.authorizationCode!, encoding: .utf8) {
    print("authorizationCode")
    print(authorizationCode)
} else {
    print("not a valid UTF-8 sequence")
}

# 换取用户信息

在获取到 authorizationCode 之后,可以调用 Authing 的接口换取该用户的信息:

POST
https://core.authing.cn/connection/social/apple/:userPoolId/callback?app_id=YOUR_APP_ID

使用 authorizationCode 换取用户信息。

Path Paramter
userPoolId
REQUIRED
string

用户池 ID

Body Paramter
code
REQUIRED
string

authorizationCode

Query Parameters
app_id
OPTIONAL
string

应用 ID,选填。如果传了应用 ID,获取的用户信息中的 token 将是使用该应用签发的 id_token;如果不传,用户信息中的 token 将是 Authing 自己签发的 token。推荐调用此接口时传 app_id

200: OK

Authing 返回给开发者的用户信息是经过加工过后的 Authing 用户标准字段,非微信文档中说明的用户字段。详细用户字段释义请见:用户资料字段释义

{
  "code": 200,
  "message": "获取用户信息成功",
  "data": {
    "id": "5fb7c7d8ee96c20ca71b6d56",
    "email": "test@example.com",
    "emailVerified": true,
    "unionid": "social:apple:001963.663e421e52eb4e1eac34d366fe0da7be.1229",
    "openid": "social:apple:001963.663e421e52eb4e1eac34d366fe0da7be.1229",
    "oauth": "{\"id\":\"001963.663e421e52eb4e1eac34d366fe0da7be.1229\",\"email\":\"test@example.com\",\"emailVerified\":true}",
    "registerSource": [
      "social:apple:web"
    ],
    "username": null,
    "nickname": null,
    "company": null,
    "photo": "https://files.authing.co/authing-console/default-user-avatar.png",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
    "phone": null,
    "tokenExpiredAt": "2020-12-06T04:10:44.664Z",
    "loginsCount": 4,
    "signedUp": "2020-11-20T13:42:48.477Z",
    "blocked": false,
    "isDeleted": false,
    "userPoolId": "xxxxx"
  }
}

# 接下来

获取到用户信息之后,你可以得到登录凭证 token,你可以在后续的 API 请求中携带上此 token, 然后在后端接口中根据此 token 区分不同用户,详情请见验证 token