Swift MailCore2 GTMAppAuth, обеспечивающий менее безопасный доступ к приложениям - PullRequest
0 голосов
/ 01 февраля 2019

Я создаю тестовое приложение с использованием MailCore2 и GTMAppAuth и столкнулся с этой ошибкой:

Не удалось установить стабильное соединение с сервером.

Я следил за различными сообщениями SO, такими как this , this и this , и поэтому я думаю, что мой код должен быть правильным.Моя реализация выглядит следующим образом:

//At AppDelegate
var currentAuthorizationFlow: OIDAuthorizationFlowSession?

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
{
    if currentAuthorizationFlow!.resumeAuthorizationFlow(with: url) {
        self.currentAuthorizationFlow = nil
        return true
    }
    return false
}

class ViewController: UIViewController {

    let kIssuer = "https://accounts.google.com"
    let kClientID = "\(MY_CLIENTID).apps.googleusercontent.com"
    let kRedirectURI = "com.googleusercontent.apps\(MY_CLIENTID):/oauthredirect"
    let kExampleAuthorizerKey = "googleOAuthCodingKey"

    override func viewDidLoad() {
        super.viewDidLoad()
        authenticateGmail()
    }

    func authenticateGmail() {
        let issuer = URL(string: kIssuer)!
        let redirectURI = URL(string: kRedirectURI)!
        let appDelegate = UIApplication.shared.delegate as! AppDelegate

        OIDAuthorizationService.discoverConfiguration(forIssuer: issuer) { (configuration, error) in
            //handleError

            if let configuration = configuration {
                let scopes = [OIDScopeOpenID, OIDScopeProfile, "https://mail.google.com/"]
                let request = OIDAuthorizationRequest(configuration: configuration, clientId: self.kClientID, scopes: scopes, redirectURL: redirectURI, responseType: OIDResponseTypeCode, additionalParameters: nil)

                appDelegate.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request, presenting: self, callback: { (authState, error) in
                    //handleError

                    if let authState = authState {
                        if let accessToken = authState.lastTokenResponse?.accessToken {
                            NSLog("Successfully authenticated: %@", accessToken)
                            self.fetchEmailsFromGmail(accessToken: accessToken)
                        }
                    }
                })
            }
        }
    }

    func fetchEmailsFromGmail(accessToken: String) {
        let session = MCOIMAPSession()
        session.hostname = "imap.gmail.com"
        session.port = 993
        session.username = "XXX@\(COMPANY_DOMAIN)"
        session.authType = .xoAuth2
        session.connectionType = .TLS
        session.oAuth2Token = accessToken

        let fetchFolderOperation = session.fetchAllFoldersOperation()
        fetchFolderOperation?.start({ (error, folders) in
            //handleError

            if let folders = folders, !folders.isEmpty {
                print(folders)
            }
        })
    }

Моя реализация позволяет мне успешно проходить аутентификацию, то есть печатается accessToken.Но когда он пытается извлечь папки, он выдает:

Не удалось установить стабильное соединение с сервером.

Дело в том, что это можно решитьвыполнив оба следующих действия:

  1. , обеспечивающих менее безопасный доступ к приложению через страницу учетных записей Googles
  2. следуйте этому решению здесь

Однако, по моему мнению, эти методы не совсем безопасны.Я не припоминаю необходимости делать что-либо из этого, когда я подключаю свою электронную почту к другим почтовым клиентам, например, Outlook и т. Д., Поэтому я не рассматриваю вышеизложенное как реальное решение.

Может кто-нибудь посоветовать?Что-то не так с моим кодом, или мне действительно приходится прибегать к обоим шагам, описанным выше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...