Skip to content
LogoLogo

Login with OAuth

Usage

do {
    if let result = try await openfort.initOAuth(
        params: OFInitOAuthParams(
            provider: provider.rawValue,
            options: ["redirectTo": AnyCodable(RedirectManager.makeLink(path: "login")?.absoluteString ?? "")]
        )
    ), let urlString = result.url, let url = URL(string: urlString) {
        await UIApplication.shared.open(url)
    }
} catch {
    print("\(error)")
}


// Handle OAuth redirect carrying access/refresh tokens and player id
if url.host == "login", let comps = URLComponents(url: url, resolvingAgainstBaseURL: false) {
    let qp: [String: String] = comps.queryItems?.reduce(into: [:]) { dict, item in
        if let v = item.value { dict[item.name] = v }
    } ?? [:]

    if let accessToken = qp["access_token"],
       let refreshToken = qp["refresh_token"],
       let playerId = qp["player_id"],
       !accessToken.isEmpty, !refreshToken.isEmpty, !playerId.isEmpty {
        do {
            // Store credentials into Openfort SDK
            try await openfort.storeCredentials(params: OFStoreCredentialsParams(player: playerId, accessToken: accessToken, refreshToken: refreshToken))

        } catch {
            print("\(error)")
        }
    }
}

Parameters

struct OFInitOAuthParams: OFCodableSendable {
    public let provider: String
    public let options: [String: AnyCodable]?
    public let ecosystemGame: String?
}

struct OFStoreCredentialsParams: OFCodableSendable {
    public let player: String?
    public let accessToken: String
    public let refreshToken: String
}

Returns

struct OFInitOAuthResponse: OFCodableSendable {
    public let url: String?
    public let key: String?
}

Throws

{
    method: method,
    success: false,
    error: error
}