前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何通过 ASWebAuthenticationSession 获取身份验证 code 码

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

作者头像
网罗开发
发布2021-05-14 15:05:22
1.6K0
发布2021-05-14 15:05:22
举报
文章被收录于专栏:网罗开发

1. 前言


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

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

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

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

网站登录身份验证逻辑:

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

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


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

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

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

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

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

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

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


3.1 配置 URL Types

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

3.2 定义全局变量
代码语言:javascript
复制
var session: ASWebAuthenticationSession!

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

3.3 获取身份验证 code 码
代码语言:javascript
复制
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 展示授权界面给用户

代码语言:javascript
复制
#pragma mark - ASAuthorizationControllerPresentationContextProviding
extension ViewController: ASWebAuthenticationPresentationContextProviding {
    func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
        return self.view.window ?? ASPresentationAnchor()
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网罗开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ▐ 3.1 配置 URL Types
  • ▐ 3.2 定义全局变量
  • ▐ 3.3 获取身份验证 code 码
  • ▐ 3.4 指定授权界面显示的 window
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档