快速配置 Sign In with Apple

作者 | Janak Amarasena 
翻译 | 知识小集 
来源 | medium

在 WWDC19 大会上,苹果公司推出了一项有意思的内容,即 “Sign In with Apple”。这项由苹果提供的认证服务,可以让开发者允许用户使用 Apple Id 来登录他们的应用程序。

通过浏览 Apple 官方文档[1] 来配置这项功能似乎是一项繁琐的事。所以在这里我将快速指导您完成一些基本的设置:)

登录 Apple 开发者账号。

我们需要获得具有 Sign In with Apple 功能的 App Id。

• 进入 Certificates, Identifiers & Profiles > Identifiers,然后单击 Identifiers 旁边左上角的 + 号;

• 选择 App IDs 并点击继续;

• 在此处输入任意 Description 和 Bundle ID(Apple建议使用反向域名样式字符串,如:com.domainname.appname)。向下滚动 Capabilities 项,并确保勾选 Sign In with Apple。最后,单击“继续”,在下一页中验证详细信息,然后单击 Register

现在我们需要获取一个 Services ID。当您调用 API 来验证用户身份时,这个值也将充当 cliend_id

• 再次进到 Certificates, Identifiers & Profiles > Identifiers,然后单击 Identifiers 旁边左上角的 + 号。

• 这次选择 Services IDs 并点击继续。

• 在此处输入任意 Description 和 Bundle ID(Apple建议使用反向域名样式字符串,如:com.domainname.appname)。务必勾选 Sign In with Apple。在这里,您必须单击 “Sign In with Apple” 旁边的 Configure 按钮。

• 单击上一步中的 Configure 按钮将显示一个 Web Authentication Configuration 面板。确保我们之前获得的 App ID 被选为 Primary App ID。接下来,您将必须添加将使用此服务的 Web Domain(不过我没有在我的域上验证 Sign In with Apple 功能,如果可以,最好验证一下)。我使用的是 example-app.com。最后,添加 Return URLs(您可以添加多个),这将是用户在使用 Sign In with Apple 进行身份验证后重定向用户的有效URL(出于快速测试目的,我使用了 https://example-app.com/redirect)。单击保存。

• 单击 Continue,然后在下一页中验证详细信息并单击 Register

现在我们需要创建一个密钥,用于获取我们的 client_secret,这也是从 Apple 发出令牌请求所必需的。

• 进入 Certificates, Identifiers & Profiles > Keys,然后单击 Keys 旁边左上角的 + 号。

• 提供密钥名称并确保勾选 Sign In with Apple。在这里,我们还必须单击 Configure。在接下来出现的 Configure Key 面板中,选择我们之前在 Choose a Primary App ID 下使用的 App ID,然后单击“保存”。

• 单击 Continue,然后在下一页中验证详细信息并单击 Register

• 下载密钥并将其保存在安全的地方,因为您永远无法再次下载密钥。下载密钥后单击 Done

嗯,这基本上就是所有配置。

我们已经拥有了 client_id,现在我们需要再调用一次 API; 我们将使用刚刚下载的私钥创建的 client_secret

客户端密钥必须是 JWT,根据 Apple 文档[2],我们需要使用带有 P-256 曲线和 SHA-256 哈希算法的椭圆曲线数字签名算法(ECDSA)来加密令牌。完成这项工作的一个简单方法是使用 ruby-jwt[3]。首先检查你是否已经有 Ruby 设置,如果没有,你可以从这里[4]获得它。

以下是我们需要在 JWT 中包含的细节。

--Header--
alg - The encryption algorithm used to encrypt the token. This will be ES256.
kid - The 10 charachter Key ID of the private key you create. You can get it from 
Certificates, Identifiers & Profiles > Keys > (click on the key you created).
--Payload--
iss - 10 character Team ID give to you. You can find it here https://developer.apple.com/account/#/membership
iat - Indicates the time at which the token was generated, in terms of the number of seconds since Epoch, in UTC.
exp - Indicates the expiry time of the token expiration, in terms of the number of seconds since Epoch, in UTC. Accroding to the docs the value must not be greater than 15777000 (6 months in seconds) from the Current Unix Time on the server.
aud - The value of which identifies the recipient the JWT is intended for. Since this token is meant for Apple, use https://appleid.apple.com.
sub - The value of which identifies the principal that is the subject of the JWT. Use the same value as client_id as this token is meant for your application.

让我们来获取 client_secret

设置 Ruby 后运行命令 sudo gem install jwt 来设置 ruby-jwt

添加必要的详细信息并将以下内容保存为 secret_gen.rb

require "jwt"

key_file = "Path to the private key"
team_id = "Your Team ID"
client_id = "The Service ID of the service you created"
key_id = "The Key ID of the private key"
validity_period = 180 # In days. Max 180 (6 months) according to Apple docs.

private_key = OpenSSL::PKey::EC.new IO.read key_file

token = JWT.encode(
    {
        iss: team_id,
        iat: Time.now.to_i,
        exp: Time.now.to_i + 86400 * validity_period,
        aud: "https://appleid.apple.com",
        sub: client_id
    },
    private_key,
    "ES256",
    header_fields=
    {
        kid: key_id
    }
)
puts token

您可以使用命令 ruby secret_gen.rb 从终端运行 secret_gen.rb 文件,它将为您提供 client_secret

好的......现在我们准备来测试 Sign In with Apple 了:)

添加你的 redirect_uri(应该是我们之前配置的 Return URL)和 client_id 并将其粘贴到浏览器中并按 Enter 键。

https://appleid.apple.com/auth/authorize?response_type=code&redirect_uri=`<redirect_uri>`&client_id=`<client_id>`

系统将提示您进行身份验证(我必须为我的 Apple ID 启用双因素身份验证才能继续)。最后,您将被重定向到 redirect_uri 并最终获得 code

在使用上面代码执行所获得的 code,之前使用的 redirect_uri 和 client_id 以及通过运行 secret_gen.rb 获得的 client_secret 替换以下命令的内容,并在终端中运行以下 cURL 命令。

curl -X POST https://appleid.apple.com/auth/token -d 'grant_type=authorization_code&code=```&redirect_uri=`<redirect_uri>`&client_id=`<client_id>`&client_secret=`<client_secret>`'

运行上述内容后,您应该最终获得访问令牌和 ID 令牌。

如果您对 Sign In with Apple 流程感到疑惑,则可以查看 OIDC Authorization Code flow[5]

如果您有兴趣了解更多关于 Sign In with Apple 的信息,请加入Apple Sign In: A Zero-Code Integration Approach Using WSO2 Identity Server[6]

参考

[1]https://developer.apple.com/sign-in-with-apple/ 
[2]https://developer.apple.com/documentation/signinwithapplerestapi/generate_and_validate_tokens 
[3]https://github.com/jwt/ruby-jwt 
[4]https://www.ruby-lang.org/en/downloads/ 
[5]https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth 
[6]https://wso2.com/library/webinars/2019/07/apple-sign-in-a-zero-code-integration-approach-using-wso2-identity-server/

------<center style="-webkit-print-color-adjust: exact;caret-color: rgb(255, 255, 255);color: rgb(255, 255, 255);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 14px;white-space: normal;text-size-adjust: auto;">

推荐阅读

• 聊聊AppDelegate解耦

• iOS 原生 App 是怎么 deselectRow 的

• 动手制作一个简易的iOS动态执行器

• iOS 流量监控分析

Vue中Axios的封装和API接口的管理

在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中。他有很多优秀的特性,例如拦截请求和响应、取消请求、转换json、客户端防御XSRF等。所以我们的尤大大也是果断放弃了对其官方库vue-resource的维护,直接推荐我们使用axios库。如果还对axios不了解的,可以移步axios文档。

发布于:10天以前  |  69次阅读  |  详细内容 »

iOS 持续集成:更完备的 App Store Connect API

时隔两年 App Store Connect API 有了更新,WWDC 2018 推出了 App Store Connect API ,用于自动化一些 App Store Connect 后台操作。这次更新包含了 app 元数据相关的API,补上了原来缺失的重要一环, 使得几乎可以通过 App Store Connect API 完成 App Store Connect 上的所有操作。今后开发、证书配置、用户管理、测试、发布全流程都可以通过 API 完成。

发布于:13天以前  |  86次阅读  |  详细内容 »

iOS 性能优化:优化 App 启动速度

苹果是一家特别注重用户体验的公司,过去几年一直在优化 App 的启动时间,特别是去年的 WWDC 2019 keynote[1] 上提到,在过去一年苹果开发团队对启动时间提升了 200%

发布于:14天以前  |  83次阅读  |  详细内容 »

让你的应用远离越狱:iOS 14 App Attest 防护功能

当越狱在 iOS 设备第一次流行起来时,iOS 开发人员会尝试各种方法来保护自己的应用程序,以让应用免受盗版等不确定因素的困扰。有许多方法可以做到这一点,包括检查 Cydia 是否存在、检测应用程序是否可读取自身沙箱之外的文件、在检测到调试器时让应用程序崩溃等等。

发布于:21天以前  |  104次阅读  |  详细内容 »

探秘 iOS 14 的 WidgetKit

Widget Extension 提供了 small, medium, large 三个尺寸,不同尺寸可以展示不同的数据、不同的界面,开发者也可以锁定自己APP的 Widget 只有某类尺寸,相同的widget也能重复添加。作为添加在主屏幕上的控件,苹果用了 “At a glance” 来形容 widget ,所以 widget extension 是无法交互的,它能做的只有展示一些信息与点击两个作用,点击后就会引导至app,同时为了性能与耗电量的考虑,Widget extension 也不能展示视频和动态图像。

发布于:23天以前  |  122次阅读  |  详细内容 »

iOS14 Widget 万字指北,先人一步获得顶级流量

2020 年 6 月 22 日,苹果召开了第一次线上的开发者大会 - WWDC20。这次发布会上宣布了ARM架构Mac芯片(拳打Intel)、iOS 14 ATT(脚踢Facebook),可谓是一次载入史册(我是爸爸)的发布会了,当然还发布了被称为下一个顶级流量入口的Widget。踩着八月的尾巴,本次我们就来探究一下Widget。本文会从Widget初窥和Widget开发两个维度和章节来探究一下Widget, 其中初窥章节会带您简单的了解一下Widget,适合应用决策者阅读; 开发章节会带着您一步一步的完成设计开发Widget,适合程序员阅读。

发布于:23天以前  |  128次阅读  |  详细内容 »

OCRunner:完全体的iOS热修复方案

为了能够实现一篇文章的思路:Objective-C源码 -> 二进制补丁文件 ->热更新(具体是哪篇我忘了)。当时刚好开始了oc2mango翻译器的漫漫长路(顺带为了学习编译原理,嘻嘻),等基本完成以后,就开始肝OCRunner:完全兼容struct,enum,系统C函数调用,魔改libffi,生成补丁文件等,尽可能兼容Objective-C,为了做一个直接运行OC的快乐人。

发布于:23天以前  |  121次阅读  |  详细内容 »

iOS APP图标版本化

在我们的项目开发过程中,需要频繁打包给测试人员去测试,有时候我们都不知道测试机上安装的版本是否是最新的,这样会造成很多不必要的麻烦和成本。因此我们需要将buildNumber以水印的方式打在APPIcon上,可以很直观的知道当前是哪一个版本。

发布于:23天以前  |  108次阅读  |  详细内容 »

百度App iOS工程化实践: EasyBox破冰之旅

百度App从单一的搜索工具发展到今天以搜索和Feed流为双引擎的综合性内容消费服务平台,其复杂程度已然不可同日而语矣。 作为一个日活过亿的超级App,业务规模庞大,相关技术人员超过千人,客户端支持主流的移动技术,涉及近百业务方,技术形态复杂,各种组件近三百个,代码百万量级,由此带来的工程化问题是技术团队的一个极大挑战。

发布于:23天以前  |  130次阅读  |  详细内容 »

百度APP iOS暗黑模式适配的完美解决方案

在2019WWDC的开场演讲中,苹果公布了即将推出的iOS13 DarkMode的新特性。此新特性不仅可以在夜晚保护视力,而且对于使用OLED的最新一代设备而言,也可以帮助用户节省电量消耗。不过此特性只支持iOS13以上的系统,为了给全系统所有用户最好的体验,研发出了一套皮肤主题框架,不仅可以全系统支持DarkMode,还可以扩展多套皮肤主题;

发布于:23天以前  |  115次阅读  |  详细内容 »

iOS 14 - 使用 PHPicker 选择照片和视频

绝大多数的 App 都要和相册打交道,选择照片或者视频,要么用来发个朋友圈,要么是放到什么地方做个背景。从 AssertLibrary 到 Photos 框架,苹果已经在多年之前就给相册相关的 API 做过一次大升级了。

发布于:25天以前  |  153次阅读  |  详细内容 »

iOS开发体验优化方案

随着Flutter等跨端框架的出现,业务开发同学经常需要在Android/iOS上跨端进行业务开发,问题定位等。新的不熟悉的环境的搭建总会遇到各种各样的问题,导致搭建失败,特别是iOS开发环境,是最复杂的,不仅环境搭建繁琐,而且切分支后的打包速度很慢,所以我们设计实现了两个工具,用于优化闲鱼iOS开发体验。

发布于:1月以前  |  167次阅读  |  详细内容 »

iOS14:再见了,“流氓”APP!

最近和苹果有关的重大消息可能就是从8月1日开始,AppStore中国区火速下架未获版号的游戏APP,数量超过30000款,之前小智就和大家说过,这未必不是一件好事,众多低质和“流氓”APP将被最大限度隔绝在iOS系统之外。

发布于:1月以前  |  207次阅读  |  详细内容 »

最多阅读

快速配置 Sign In with Apple 1年以前  |  3269次阅读
开篇 关于iOS越狱开发 1年以前  |  2363次阅读
给数组NSMutableArray排序 1年以前  |  2358次阅读
APP适配iOS11 1年以前  |  2290次阅读
在越狱的iPhone设置上使用lldb调试 1年以前  |  2262次阅读
UITableViewCell高亮效果实现 1年以前  |  2184次阅读
App Store 审核指南[2017年最新版本] 1年以前  |  2127次阅读
使用 GPUImage 实现一个简单相机 1年以前  |  2101次阅读
所有iPhone设备尺寸汇总 1年以前  |  2049次阅读
使用ssh访问越狱iPhone的两种方式 1年以前  |  1961次阅读
关于Xcode不能打印崩溃日志 1年以前  |  1960次阅读
使用ssh 访问越狱iPhone的两种方式 1年以前  |  1826次阅读
UIDevice的简单使用 1年以前  |  1686次阅读
为对象添加一个释放时触发的block 1年以前  |  1645次阅读
使用最高权限操作iPhone手机 1年以前  |  1596次阅读