Поддерживает ли AsWebAuthenticationsession универсальные ссылки?
Я использую AsWebAuthenticationsession для аутентификации из другого приложения в свое приложение. Я открываю сессию AsWebAuthentication и перенаправляю универсальные ссылки моего приложения. Проблема в том, что когда он перенаправляет универсальную ссылку на мое приложение, он запрашивает открытие App Store. Когда он перенаправляет закрытый сеанс, что я хочу. Но AsWebAuthenticationsession принимает только настраиваемую схему URL. Как мне с этим справиться? Поскольку настраиваемая схема URL-адресов небезопасна: RFC8252 7.1
2 ответа
Я могу подтвердить, что это работает с iOS 14 или более поздней версии, но не проверял более ранние версии.
Когда вы инициализируете свой, вы можете пройти
callbackURLScheme: "https"
.
Когда поставщик аутентификации перенаправляет вас на вашу универсальную ссылку, делегат вашего приложенияapplication(_:continue:restorationHandler:)
будет срабатывать с правильным URL-адресом перенаправления, однако обработчик завершения не срабатывает, и поэтому диалоговое окно аутентификации остается на экране.
Вам нужно будет сохранить ссылку на
ASWebAuthenticationSession
а также
cancel()
это вручную, чтобы отклонить его вместо этого.
Вы можете попробовать с помощью этого метода
Чтобы добавить одноэлементный класс для обработки этого обратного вызова
SceneDelegate.swift
@available(iOS 13.0, *)
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
// handle here
OAuthManager.instance.callBackUserActivity(userActivity: userActivity)
}
OAuthManager.swift
import Foundation
import AuthenticationServices
protocol UserActivityListener {
func callBackUserActivity( userActivity : NSUserActivity )
}
class OAuthManager {
public static let instance = OAuthManager()
var asWebSession: ASWebAuthenticationSession?
}
extension OAuthManager : UserActivityListener {
func callBackUserActivity(userActivity: NSUserActivity) {
// Get URL components from the incoming user activity.
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL,
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true) else {
return
}
// Check for specific URL components that you need.
guard let path = components.path,
let params = components.queryItems else {
return
}
// cancel your ASWebAuthenticationSession
asWebSession?.cancel()
print("path = \(userActivity.webpageURL)")
if let token = params.first(where: { $0.name == "token" })?.value {
print("token = \(token)")
}
}
}
YourViewController.swift
class YourViewController: UIViewController {
// set your instance
var oauthManager = OAuthManager.instance
private func startSignInAsWebAuthSession() {
let callbackURLScheme = "YOURAPP"
guard let authURL = URL(string: "YOUR URL LINK") else { return }
self.oauthManager.asWebSession = ASWebAuthenticationSession.init(url: authURL, callbackURLScheme: callbackURLScheme,completionHandler: { callbackURL, error in
// we dont listen to the call back, this web authentication session only open for login only
})
oauthManager.asWebSession?.prefersEphemeralWebBrowserSession = true
oauthManager.asWebSession?.presentationContextProvider = self
oauthManager.asWebSession?.start()
}
}
extension YourViewController: ASWebAuthenticationPresentationContextProviding {
func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
ASPresentationAnchor()
}
}