Apple
login getAuthticationState observeAppleSignInState
概述
苹果登录
2019年6月7日星期日,苹果召开了发布大会。宣布苹果 iOS 13 支持通过 Apple 登录功能。通过Apple登录旨在为你提供保护个人隐私。Apple产品内建安全机制保护的登录体验。通过Apple登录可让你在不向开发者提供任何可识别你个人身份的信息的条件下登录某款App,从而保护你的隐私。通过Apple登录时,苹果会随机生成一个与你账户关联的唯一标识符并提供给App开发者,从而保护你信息的隐私性。每一位App开发者收到的此标识符各不相同,以防止开发者收集与你在App生态系统间的活动相关的信息。
由于某些App可能有合法理由收集更多与你相关的信息。例如,为了能够通过电子邮件联系你或者通过名字找到你的账户。部分开发者可能会请求获取你的名字和电子邮件地址,作为通过Apple登录流程的一部分。你可以选择向这些开发者提供与你Apple关联的名字和主要电子邮件地址,或者编辑你的名字。选择其它与你Apple ID关联的电子邮件地址,甚至可以完全隐藏你的电子邮件地址。如果你选择隐藏电子邮件地址,苹果会向开发者提供一个随机电子邮件地址,然后将该地址收到的电子邮件转发到你选择的电子邮件地址。你随时可以在设置>Apple ID>姓名、电话号码、电子邮件中更改,转发电子邮件或者停用电子邮件转发。
你通过Apple登录操作与你的iCloud账户关联,以便你可以在所有设备上轻松完成登录。你的通过Apple登录操作以苹果无法读取的方式储存。虽然你的设备会保留你使用通过Apple登录的时间记录,但你登录哪款App以及何时登录的相关信息不会与苹果共享。若要管理通过Apple登录,请前往设置>Apple ID>密码与安全性>使用你Apple ID的App。你可以找到使用通过Apple登录的App列表,查阅其隐私政策以及条款与条件,以及停用通过Apple登录。如果你选择停用某款App的通过Apple登录,开发者会依据其隐私政策继续处理与你通过Apple登录关联的任何信息。
苹果致力于使用通过触控ID和面容ID,以及复杂密码的身份认证来保护通过Apple登录功能。创建账户期间,苹果会使用你与苹果的交易和你的苹果使用经历,以及设备的相关信息来帮助防止欺诈行为。
现在的应用程序基本上都是需要注册登录的,现在平台提供第三方注册选项。国外包括Google、Facebook、Twitter等,国内常见的是QQ、WeChat、包括游戏登录等。使用第三方登录无疑给用户提供了便利,不需要每次登录新的应用就需要进行个人信息注册的繁琐流程。但是,这里面也存在着一些问题。
用户允许第三方平台登录,并向开发者发送个人电子邮件地址。平台本身可以知道你使用的应用程序。不仅是敏感的应用程序,所有应用程序都会给平台提供无数用户的个人生活信息。第三方平台运用这些信息进行商业运动,或者将用户信息进行划分,并进行分类广告推送。Facebook当时也是因为这样泄露了用户隐私,才受到抵制。苹果无疑是看到了facebook的前车之鉴,在iOS 13中提供的“苹果登录”用以解决这个问题。苹果公司提供了与开发商共享、隐藏的用户的电子邮件地址。如果选择隐藏个人信息,苹果会创建一个一次性电子邮件地址,用户和第三方应用程序之间的邮件登录信息通过苹果转发,不会泄露出用户的真实邮件地址。
针对这个功能,苹果向开发者提出一个要求和一个建议。要求是如果苹果开发者提供任何其他第三方登录,同时需要提供“苹果登录”选项。也就是说,如果软件要求“微信登录”或是“QQ登录”时,必须同时提供“苹果登录”的选项给用户自行选择。根据苹果公司最新公布的指南,要求开发者在苹果终端的应用程序登录界面上,将“苹果登录”选项列在任何其他第三方登录的选项之上。虽然这只是苹果的指南建议,并非苹果商店的审查要求,但是开发者认为这无疑是通过苹果审核的一个好方法。
详情参考 苹果登录官方文档。
模块概述
本模块封装了苹果登录功能。
首先要创建 entitlements
文件。APICloud 平台上的开发者,可通过此文件告诉编译服务器开通苹果登录功能功能。配置方法参考论坛帖子。配置示例如下:
```js
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
</dict>
</plist>
```
其中 com.apple.developer.applesignin 对应的值为 Default。详情参考 苹果文档
然后创建一个 key,创建方法见 Create a Sign In with Apple private key。创建完成后下载这个 key,会得到一个 .p8
文件。注意只能下载一次,下载后要好好保存。
最后登录苹果开发者账号,在左侧列表里找到 Identifiers,选中后再找到你的 Bundle ID (包名),选中该包名,配置开启其苹果登录功能。如下下图所示:
准备工作完成,下面解释下苹果登录的逻辑流程。参见 Authenticating Users with Sign in with Apple。然后根据需要 验证用户。服务端拿 authorizationCode 去苹果后台验证,苹果返回id_token,与客户端获取的identityToken值是否一样)。 About refresh the token
注意:本功能只支持在 iOS 13.0 及以上版本的设备
模块接口
login
用苹果账号登录
login({params},callback(ret, err))
params
requestedScopes:
- 类型:数组
- 描述:范围,仅在第一次登录有效
- 取值范围:
- fullName:用户名
- email:邮件
callback(ret, err)
ret:
- 类型:JSON 对象
- 内部字段:
{
status: true //布尔型;true||false,是否登录成功
authInfo:{
user:''
state:''
email:'',
authorizationCode:'',
identityToken:'',
realUserStatus:'',
authorizedScopes:[ ],
fullName:{
namePrefix:,
givenName:,
middleName:,
familyName:,
nameSuffix:,
nickname:
}
}
}
err:
- 类型:JSON 对象
- 内部字段:
{
code: 0, //数字类型;错误码
//1000:授权请求失败未知原因(未有AppleID登录,或用户删除了授权该app)
//1001:用户取消了授权请求
//1002:授权请求响应无效
//1003:未能处理授权请求
//1004:授权请求失败
msg:'' //字符串类型;错误信息
}
示例代码
var Apple = api.require('Apple');
Apple.login(function(ret, err) {
if (ret.status) {
alert(JSON.stringify(ret));
} else {
alert(JSON.stringify(err));
}
});
可用性
iOS 系统
可提供的 1.0.0 及更高版本
getAuthticationState
获取授权状态
getAuthticationState({params},callback(ret))
params
user:
- 类型:字符串
- 描述:用户ID
callback(ret)
ret:
- 类型:JSON 对象
- 内部字段:
{
state:'' //字符串类型;授权状态
//userIdError:用户ID无效
//revoked:苹果授权凭证失效
//authorized:苹果授权凭证状态良好
//notFound:未发现苹果授权凭证
//transferred:苹果授权凭证转移的
//unknownError:未知错误
//unsupported:不支持苹果登录
}
示例代码
var Apple = api.require('Apple');
Apple.getAuthticationState(function(ret) {
api.alert({msg:JSON.stringify(ret)});
});
可用性
iOS 系统
可提供的 1.0.1 及更高版本
observeAppleSignInState
监听用户从设置内删除该App的授权事件,注意:删除后无法再次授权该App
observeAppleSignInState(callback())
callback()
本回调函数无参数
示例代码
var Apple = api.require('Apple');
Apple.observeAppleSignInState(function(ret) {
api.alert({msg:'用户从设置内删除该App的授权'});
});
可用性
iOS 系统
可提供的 1.0.1 及更高版本