Моя - невозможно вызвать API с учетными данными для аутентификации

Я разрабатываю приложение для iOS с использованием инфраструктуры django rest для apis. Но в настоящее время я не могу продвинуться вперед при вызове API с учетными данными для аутентификации.

Мне удалось вызвать api с помощью Postman и curl, установив заголовок как Authentication Bearer <token> .. но мне постоянно не удавалось вызвать его из приложения iOS. Я использую Moya для вызова api. И я не знаю, что мне делать дальше.

Что пробовал: (при звонке Мойе)

let token = "abcde12345sometoken"
let plugin = AccessTokenPlugin(tokenClosure: token)
let provider = MoyaProvider<AccountAPI>(plugins : [plugin])
provider.request(.getAccountProfile(oauth_id: oauth_id, provider: "facebook")) { (result) in 
    // doing something with result
}

и настроил API как:

extension AccountAPI : TargetType, AccessTokenAuthorizable {

    // codes conforming variables to TargetType protocol

    public var authorizationType: AuthorizationType {
        switch self {
        case .getFacebookAccountToken:
            return .none
        default:
            return .bearer
        }
    }

    public var headers: [String: String]? {
        switch self {
            case .getFacebookAccountToken, .getEmailAccountToken: // post requests
            return ["Content-type":"application/x-www-form-urlencoded"]
        default:
            return ["Content-type":"application/json"]
        }
    }
}

Есть ли что-нибудь, что я должен учитывать при использовании Moya для аутентификации или, возможно, с Info.plist и т. Д.? Или в документе говорится, что этот подход предназначен для токена JWT, и, возможно, мой метод не для JWT и чего-то еще ..? Дай мне совет!


person Kyuhyeok Park    schedule 22.09.2017    source источник
comment
Как выглядит ваш заголовок var? действительно ли он отменяет заголовок?   -  person user805981    schedule 07.11.2017
comment
Я отредактировал вопрос, добавив заголовок var, и я думаю, что должен добавить заголовок Accept-Language, когда он нужен ... какие-либо предложения?   -  person Kyuhyeok Park    schedule 08.11.2017
comment
Это странно. Значит, заголовок в вашем API не отменяет ваш плагин?   -  person user805981    schedule 09.11.2017
comment
Нет, я не переопределял плагин .. Я думаю, дело в том, что сервер api перенаправляет запросы без языкового кода uri, и, возможно, в процессе возникают какие-то ошибки   -  person Kyuhyeok Park    schedule 09.11.2017


Ответы (2)


В моем случае я использую

  • Moya 12.0.1
  • MultiTarget

пример:

plugins = [AccessTokenPlugin(tokenClosure: {
    let token = ...
    return token
})]
MoyaProvider<MultiTarget>(
    plugins: plugins
)
.request(MultiTarget(myAPI)) {
    ...
}

Но он никогда не вызывает tokenClosure

Решение, вам нужно добавить это расширение

extension MultiTarget: AccessTokenAuthorizable {

    public var authorizationType: AuthorizationType {
        guard let target = target as? AccessTokenAuthorizable else { return .none }
        return target.authorizationType
    }

}

источник: https://github.com/Moya/Moya/blob/master/Sources/Moya/Plugins/AccessTokenPlugin.swift#L62

person Ted    schedule 03.03.2019

После нескольких часов попыток то и это ... я обнаружил, что это была конечная точка api, которая перенаправляет себя на основе языка содержимого ... поэтому установленный мной заголовок не работает при перенаправлении. Так что либо установка URL-адреса i18n заранее, либо установка заголовка на языке содержимого решит мою проблему.

person Kyuhyeok Park    schedule 22.09.2017