文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何通过 ASWebAuthenticationSession 获取身份验证 Code 码

2024-12-03 05:06

关注

1. 前言

项目中需要实现 GitHub、Google、Apple 登录,实现第三方登录方案有 3 种:

今天来讲一下不集成 SDK 打开浏览器登录获取身份验证。

这需要使用 ASWebAuthenticationSession 获取身份验证 code 码。

网站登录身份验证逻辑:

一些网站作为一种服务提供了一种用于验证用户身份的安全机制。

当用户导航到站点的身份验证URL时,站点将向用户提供一个表单以收集凭据。

验证凭据后,站点通常使用自定义方案将用户的浏览器重定向到指示身份验证尝试结果的URL。

2. 不集成 SDK 打开浏览器登录

你可以通过使用指向身份验证网页的 URL 初始化实例来在应用程序中使用网络身份验证服务。

该页面可以是你维护的页面,也可以是由第三方操作的页面。

通过打开浏览器登录并获取身份验证 code 码,可以分为两种情况:

  1. 一种情况是在 App 内部打开浏览器获取身份验证
  2. 一种是打开手机自带浏览器获取身份验证

尝试第一种情况之后 GitHub 和 Apple 均可以正常打开浏览器并且成功登录拿到身份验证码。

但是 Google 提示在 App 内部打开登录页面是不安全的,因此只能选择第二种方式。

3. 打开手机自带浏览器获取身份验证

3.1 配置 URL Types

建议使用 bundle id 保证唯一性。

3.2 定义全局变量

  1. var session: ASWebAuthenticationSession! 

var session : ASWebAuthenticationSession! 需要设置为全局变量,设置为局部变量会被释放掉导致弹框闪现。

3.3 获取身份验证 code 码

  1. func oauthLogin(type: String) { 
  2.     // val GitHub、Google、SignInWithApple 
  3.     let redirectUrl = "配置的 URL Types" 
  4.     let loginURL = Configuration.shared.awsConfiguration.authURL + "/authorize" + "?identity_provider=" + type + "&redirect_uri=" + redirectUri + "&response_type=CODE&client_id=" + Configuration.shared.awsConfiguration.appClientId 
  5.     session = ASWebAuthenticationSession(url: URL(string: loginURL)!, callbackURLScheme: redirectUri) { url, error in 
  6.         if error != nil { 
  7.             return 
  8.         } 
  9.         if let responseURL = url?.absoluteString { 
  10.             let components = responseURL.components(separatedBy: "#"
  11.             for item in components { 
  12.                 if item.contains("code") { 
  13.                     let tokens = item.components(separatedBy: "&"
  14.                     for token in tokens { 
  15.                         if token.contains("code") { 
  16.                             let idTokenInfo = token.components(separatedBy: "="
  17.                             if idTokenInfo.count > 1 { 
  18.                                 let code = idTokenInfo[1] 
  19.                                 print("身份验证 code 码: \(code)"
  20.                                 return 
  21.                             } 
  22.                         } 
  23.                     } 
  24.                 } 
  25.             } 
  26.         } 
  27.     } 
  28.     session.presentationContextProvider = self 
  29.     session.start() 

这里面有两个参数,一个是 redirectUri,一个是 loginURL。

redirectUri 就是 3.1 配置的白名单,作为页面重定向的唯一标示。

loginURL 是由 5 块组成:

  1. 服务器地址:Configuration.shared.awsConfiguration.authURL + "/authorize"
  2. 打开的登录平台:identity_provider = "GitHub"
  3. 重定向标识:identity_provider = "配置的 URL Types"
  4. 相应类型:response_type = "CODE"
  5. 客户端 ID:client_id = "服务器配置"

回调中的 url 包含我们所需要的身份验证 code 码,需要层层解析获取 code。

3.4 指定授权界面显示的 window

告诉代理应该在哪个 window 展示授权界面给用户

  1. #pragma mark - ASAuthorizationControllerPresentationContextProviding 
  2. extension ViewController: ASWebAuthenticationPresentationContextProviding { 
  3.     func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor { 
  4.         return self.view.window ?? ASPresentationAnchor() 
  5.     } 

 

来源:网罗开发内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯