微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对于不支持iOS 13的平台,如何使用WKWebView处理Apple登录?

如何解决对于不支持iOS 13的平台,如何使用WKWebView处理Apple登录?

我正在开发必须支持iOS 10.0及更高版本的Apple登录的应用程序。对于最新的iOS,我可以使用AuthenticationServices本机库。很好,但是,对于iOS 10-12,我们希望使用WKWebView来处理嵌入在应用程序中的身份验证,以便在身份验证后获取令牌电子邮件(如果可能)完成。

我正在遵循苹果的官方指南: https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/incorporating_sign_in_with_apple_into_other_platforms

现在的问题是,当我配置redirect_uri时,如何在身份验证成功完成后从WKWebView获取令牌?我已经“试图”拦截响应并通过WKWebKit的WKNavigationDelegate navigationResponse响应主体获取令牌,但无济于事。我缺少关键信息。

public func webView(_ webView: WKWebView,decidePolicyFor navigationAction: WKNavigationAction,decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(.allow)
}
private func signInUsingWebAuthenticationSession() {

        let queryItems = [
            URLQueryItem(name: "client_id",value: "com.devapp.app"),URLQueryItem(name: "redirect_uri",value: "https://dev.devapp.com/redirect"),URLQueryItem(name: "response_type",value: "code id_token"),// Or code
            URLQueryItem(name: "scope",value: "name email"),// Retrieve name and email
            URLQueryItem(name: "response_mode",value: "form_post")
        ]

        var urlComps = URLComponents(string: "https://appleid.apple.com/auth/authorize")!
        urlComps.queryItems = queryItems

        guard let authURL = urlComps.url else {
            return
        }

        /// ... Load this url in WKWebView
}

我希望那里有一些聪明的开发人员,他们曾经遇到过/解决了这个问题,并乐于分享他们的知识。 干杯!

P.S如果还有其他可行的解决方案,请随时发表评论

解决方法

如果您支持小于13的iOS版本,则您的应用将不获批准。如果您需要使用Apple ID实施登录,则必须使用其JS解决方案,因为您已经猜到了较旧的版本。我仍在尝试找出方法

,

我现在已经完成了对iOS9-iOS12的Apple SignIn支持,如果其他开发人员需要与此相关的帮助,我想发布解决方案。事实证明,答案已经在文档中了(下面的链接),但是有些词只需要更多说明。

https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/incorporating_sign_in_with_apple_into_other_platforms

解决方案:

  1. 首先,您发送到Apple Auth REST API的'redirect_uri'不能是自定义方案,因为仅支持http / https。要将身份验证数据(包括id_token数据)重定向到您的应用,您需要有权访问自己的服务器,解析响应(或其他逻辑),并在API返回到上面指定的“ redirect_uri”之后自行执行重定向。如何将身份验证数据安全地发送到应用程序取决于您。选项是自定义方案,或来自服务器的重定向URL(带有“附加”身份验证数据),并从中解析出id_token。我已经使用WKWebView和WKNavigationDelegate的definePolicyFor委托来捕获URL信息。

  2. 一旦在您的应用程序中捕获了身份验证数据,就可以关闭WKWebView。 Auth数据包含JWT。如果您需要用户数据和电子邮件(如果您在范围内要求)等,则需要解码JWT并查看“ sub”和“ email”。我使用JWTDecode库解码https://github.com/auth0/JWTDecode.swift

  3. 对于iOS13 +,只需使用内置的AuthenticationServices的ASAuthorizationController。

干杯!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。