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

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

1. 前言

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

  • 集成第三方一键登录
  • 分别集成 GitHub、Google、Apple 登录 SDK
  • 不集成 SDK 打开浏览器登录

今天来讲一下不集成 SDK 打开浏览器登录获取身份验证。这需要使用 ASWebAuthenticationSession 获取身份验证 code 码。

网站登录身份验证逻辑:

  1. 一些网站作为一种服务提供了一种用于验证用户身份的安全机制。
  2. 当用户导航到站点的身份验证URL时,站点将向用户提供一个表单以收集凭据。
  3. 验证凭据后,站点通常使用自定义方案将用户的浏览器重定向到指示身份验证尝试结果的URL。

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

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

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

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

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

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

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

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

3.1 配置 URL Types

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

3.2 定义全局变量
var session: ASWebAuthenticationSession!

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

3.3 获取身份验证 code 码
    func oauthLogin(type: String) {
        // val GitHub、Google、SignInWithApple
        let redirectUrl = "配置的 URL Types"
        let loginURL = Configuration.shared.awsConfiguration.authURL + "/authorize" + "?identity_provider=" + type + "&redirect_uri=" + redirectUri + "&response_type=CODE&client_id=" + Configuration.shared.awsConfiguration.appClientId
        session = ASWebAuthenticationSession(url: URL(string: loginURL)!, callbackURLScheme: redirectUri) { url, error in
            if error != nil {
                return
            }
            if let responseURL = url?.absoluteString {
                let components = responseURL.components(separatedBy: "#")
                for item in components {
                    if item.contains("code") {
                        let tokens = item.components(separatedBy: "&")
                        for token in tokens {
                            if token.contains("code") {
                                let idTokenInfo = token.components(separatedBy: "=")
                                if idTokenInfo.count > 1 {
                                    let code = idTokenInfo[1]
                                    print("身份验证 code 码: \(code)")
                                    return
                                }
                            }
                        }
                    }
                }
            }
        }
        session.presentationContextProvider = self
        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 展示授权界面给用户

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

获取源码方式:公众号「网罗开发」后台回复 “210511” 即可获取

本文已在公众号「网罗开发」发布,如果转载长白请加微信:FBY-fan,备注转载长白

目录
相关文章
|
存储 算法 数据库
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
666 0
|
存储 前端开发 数据库
electron项目中使用本地数据库sqlite3和sequelize框架
electron项目中使用本地数据库sqlite3和sequelize框架
|
Ubuntu 数据安全/隐私保护
Ubuntu下/etc/sudoers的设置和sudo免密码执行及设置无效的原因
Ubuntu下免密码执行sudo及设置无效的原因
3855 0
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
542 61
|
Web App开发 JSON 小程序
苹果app开发apple-app-site-association文件配置
apple-app-site-association 是苹果的配置文件,用于建立app和网站关联,支持Universal Links,使点击网站链接能直接打开相应app内部页面。配置文件为JSON格式,需上传至服务器`.well-known`目录或根目录。通过检查三个链接来测试配置,确保Content-Type为`application/json`。成功配置后,点击链接能在iPhone备忘录或Safari中直接唤起app,但可能有24-48小时延迟。
|
Java 数据安全/隐私保护 网络架构
一个简单的示例在spring boot中实现国际化
一个简单的示例在spring boot中实现国际化
|
存储 SQL 人工智能
【云栖实录】Hologres3.0全新升级:一体化实时湖仓平台
2024年云栖大会,Hologres 3.0全新升级为一体化实时湖仓平台,通过统一数据平台实现湖仓存储一体、多模式计算一体、分析服务一体、Data+AI 一体,发布 Dynamic Table、External Database、分时弹性、Query Queue、NL2SQL 等众多新的产品能力,实现一份数据、一份计算、一份服务,极大提高数据开发及应用效率。同时,Hologres 的预付费实例年付折扣再降15%,仅需7折,不断帮助企业降低数据管理成本,赋能业务增长。
|
存储 网络协议 数据可视化
【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步?
【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步?
1130 0
|
前端开发 JavaScript 数据管理
房屋租赁|基于JavaWeb实现一个房屋租赁平台系统
房屋租赁|基于JavaWeb实现一个房屋租赁平台系统
374 1
|
存储 Kubernetes 网络协议
k8s教程(基础篇)-基本概念和术语(上)
k8s教程(基础篇)-基本概念和术语(上)
416 0