Поддерживает ли 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()
    }
  }
Другие вопросы по тегам