本文转载自微信公众号《Snap开发》,作者展飞。转载本文请联系网路发展公众号。一、前言项目需要实现GitHub、Google、Apple登录。第三方登录方案一共有三种:集成第三方一键登录分别集成GitHub、Google、Apple登录SDK不集成SDK打开浏览器登录今天说说不同的集成SDK打开浏览器登录验证。这需要使用ASWebAuthenticationSession来获取验证码。网站登录认证逻辑:一些网站提供了用户认证的安全机制作为一种服务。当用户导航到该站点的身份验证URL时,该站点会向用户显示一个表单以收集凭据。验证凭据后,站点通常使用自定义方案将用户的浏览器重定向到指示身份验证尝试结果的URL。2.不集成SDK打开浏览器登录您可以在您的应用程序中使用Web认证服务,通过初始化一个指向认证网页的URL实例。该页面可以是您维护的页面,也可以是第三方运营的页面。打开浏览器登录获取验证码,分为两种情况:一种是在app内部打开浏览器获取验证码,另一种是打开手机自带浏览器获取验证码authenticationaftertryingthefirstsituationGitHub和Apple都可以正常打开浏览器并成功登录获取验证码。但是谷歌提示在App里面打开登录页面不安全,只能选择第二种方式。3、打开手机内置浏览器获取认证3.1配置URL类型建议使用bundleid保证唯一性。3.2定义全局变量varsession:ASWebAuthenticationSession!varsession:ASWebAuthenticationSession!需要设置为全局变量,如果设置为局部变量,则释放,弹出框闪烁。3.3获取身份验证码funcoauthLogin(type:String){//valGitHub、Google、SignInWithAppleletredirectUrl="配置的URLTypes"letloginURL=Configuration.shared.awsConfiguration.authURL+"/authorize"+"?identity_provider="+type+"&redirect_uri="+redirectUri+"&response_type=CODE&client_id="+Configuration.shared.awsConfiguration.appClientIdsession=ASWebAuthenticationSession(url:URL(string:loginURL)!,callbackURLScheme:redirectUri){url,erroriniferror!=nil{return}ifletresponseURL=url?.absoluteString{letcomponents=responseURL.components(separatedBy:"#")foritemincomponents{ifitem.contains("code"){lettokens=item.components(separatedBy:"&")fortokenintokens{iftoken.contains("code"){letidTokenInfo=token.components(separatedBy:"=")ifidTokenInfo.count>1{letcode=idTokenInfo[1]print("身份验证码:\(code)")return}}}}}}session.presentationContextProvider=selfsession.start()}这里有两个参数,一个是redirectUri,一个是loginURLredirectUri,是3.1配置的白名单,是页面重定向的唯一指标。loginURL由5块组成:服务器地址:Configuration.shared.awsConfiguration.authURL+"/authorize"开启登录平台:identity_provider="GitHub"重定向ID:identity_provider="ConfiguredURLTypes"对应类型:response_type="CODE"clientID:client_id="serverconfiguration"回调中的url包含了我们需要的认证码,需要逐层解析得到该码。3.4指定授权界面显示的窗口,告诉agent授权界面应该在哪个窗口显示给用户#pragmamark-ASAuthorizationControllerPresentationContextProvidingextensionViewController:ASWebAuthenticationPresentationContextProviding{funcpresentationAnchor(forsession:ASWebAuthenticationSession)->ASPresentationAnchor{returnsself.view.window??ASPresent)}
