Вход в LinkedIn с помощью Stormpath

Я могу быстро получить токен доступа к своей учетной записи LinkedIn, используя LinkedIn SDK. Как аутентифицировать этот логин с помощью Stormpath?

[Обновление]

let APIURL = "https://api.stormpath.com/v1/applications/LI_APPLICATION_ID/аккаунты"

func sendRequestWithJSON(accessToken:String)
{
    let json = [ "providerData" : ["providerId": "linkedin", "accessToken": accessToken] ]


    do {

        let jsonData = try NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted)

        let username = STORMPATH_API_KEY_ID
        let password = STORMPATH_API_KEY_SECRET
        let loginString = NSString(format: "%@:%@", username, password)
        let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!
        let base64LoginString = loginData.base64EncodedDataWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)

        // create post request
        let url = NSURL(string: APIURL)!
        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "POST"


        // insert json data to the request
        request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.HTTPBody = jsonData


        let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in
            if error != nil{
                print("Error -> \(error)")
                return
            }

            do {
                let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject]

                print("Result -> \(result)")

            } catch {
                print("Error -> \(error)")
            }
        }

        task.resume()
        //return task
    } catch {
        print(error)
    }
}

Я передаю выборку accessToken из linkedin в вышеуказанную функцию, но она возвращает результат ниже:

["message": Требуется аутентификация., "status": 401, "code": 401, "developerMessage": Требуется аутентификация с действительным ключом API., "moreInfo": http://www.stormpath.com/docs/quickstart/connect]

Что я делаю не так?


person chetan rane    schedule 03.05.2016    source источник
comment
Возможный дубликат связанной аутентификации iOS   -  person JAL    schedule 03.05.2016
comment
Я не думаю, что это дубликат. Связанный вопрос касается ванильного входа в LinkedIn, а этот вопрос касается приложения, поддерживаемого Stormpath.   -  person Nate Barbettini    schedule 03.05.2016


Ответы (1)


LinkedIn — интересный зверь, так как их мобильные SDK имеют два недостатка:

  • Конечному пользователю НЕОБХОДИМО установить приложение LinkedIn, иначе кнопка «Войти» перенаправит пользователя в App Store.
  • Токен мобильного доступа нельзя использовать на сервере. См. этот скриншот с Документация LinkedIn для iOS

Итак, чтобы заставить аутентификацию работать на мобильных устройствах, я бы рекомендовал использовать сервер для обработки потока, поэтому вам не нужно беспокоиться об этих двух недостатках. Это примерно:

  1. Приложение перенаправит пользователя на ваш веб-сервер.
  2. Веб-сервер запускает процесс аутентификации LinkedIn и перенаправляет пользователя в LinkedIn.
  3. Пользователь входит в LinkedIn и перенаправляется обратно на ваш веб-сервер.
  4. Веб-сервер читает ответ и обменивает код авторизации с LinkedIn на токен доступа.
  5. Веб-сервер перенаправляет вашего пользователя обратно в приложение, используя настраиваемую схему URL-адресов, чтобы отправить ему токен доступа LinkedIn.
  6. Приложение использует токен доступа LinkedIn для входа в Stormpath.

Звучит сложно? На самом деле все проще, чем кажется. На самом деле я написал некоторый демонстрационный код для этого процесса, используя Express.js и Swift, если вы хочу попробовать. Дайте мне знать, если это работает для вас!

person Edward Jiang    schedule 03.05.2016
comment
Спасибо Эдуард за помощь. Позвольте мне попробовать предоставленный вами пример (приму его как ответ после выполнения;)) - person chetan rane; 04.05.2016
comment
Привет, Эдвард. Не могли бы вы сказать мне, какие настройки мне нужно сделать с быстрым проектом для запуска вашего приложения? Я не могу запустить это приложение на симуляторе. - person chetan rane; 04.05.2016
comment
Какую ошибку вы получаете? Он должен работать из коробки. - person Edward Jiang; 04.05.2016
comment
Моя основная проблема в том, что я использую Linkedin Mobile SDK для получения токена доступа. - person chetan rane; 05.05.2016
comment
Есть ли конкретная причина, по которой вы хотите использовать LinkedIn SDK для iOS? Выше я ссылался на документацию LinkedIn, где прямо говорится, что его нельзя использовать на сервере, поэтому SDK LinkedIn, к сожалению, не будет работать со Stormpath. - person Edward Jiang; 05.05.2016
comment
Тем не менее, созданный мной пример кода должен работать для того, чтобы вход в LinkedIn работал с Stormpath! Дайте мне знать, какие проблемы у вас возникают при запуске приложения на симуляторе. - person Edward Jiang; 05.05.2016
comment
Мое единственное требование: я просто хочу, чтобы пользователь linkedin мог войти в мое приложение. И для этого я не хочу ничего писать на стороне сервера. Вот почему пытаются реализовать его на стороне клиента. Но теперь я понимаю, я не могу проверить получение токена доступа с помощью мобильного SDK Likedin с stormpath, верно? Есть ли обходной путь для этого? Однако я обновил вопрос. Я получаю сообщение об ошибке на localhost:3000 Я понятия не имею, как запустить сервер - person chetan rane; 05.05.2016
comment
Без проблем. Попробуйте: загрузите Node.js: nodejs.org/en, затем следуйте краткому руководству по Node.js по адресу api.stormpath.com, чтобы установить переменные среды для Stormpath. Затем выполните шаги 4/5, перечисленные в файле readme репозитория Git. - person Edward Jiang; 05.05.2016
comment
так обязательно ли настраивать сервер? Я не могу обойти это? Альтернативы нет? Поскольку google и facebook с stormpath не требуют настройки дополнительного сервера - person chetan rane; 05.05.2016
comment
Да, LinkedIn требует этого, если вы хотите использовать токен доступа в другом месте, например, в Stormpath. - person Edward Jiang; 05.05.2016
comment
Давайте продолжим обсуждение в чате. - person chetan rane; 05.05.2016