2016-11-26 7 views
7

Т.Л., д-р я получаю: JSON text did not start with array or object and option to allow fragments not set. если я пытаюсь получить маркер и No refresh token available in the session! если я пытаюсь обновить токен.Как правильно обрабатывать маркер обновления с Spotify SDK и Swift Code 3. Ошибка = 3840

Я пытаюсь настроить маркер обновления для Objective-C Spotify IOS SDK бета-25 в Swift 3. Я использую сервера Heroku и сценарий Ruby, предоставленный Spotify, изменил мои полномочия.

require 'sinatra' 
require 'net/http' 
require 'net/https' 
require 'base64' 
require 'encrypted_strings' 
require 'json' 

CLIENT_ID = ENV['xxx'] 
CLIENT_SECRET = ENV['xxx'] 
ENCRYPTION_SECRET = ENV['xxx'] 
CLIENT_CALLBACK_URL = ENV['xxx://returnafterlogin'] 
AUTH_HEADER = "Basic " + Base64.strict_encode64(CLIENT_ID + ":" + CLIENT_SECRET) 
SPOTIFY_ACCOUNTS_ENDPOINT = URI.parse("https://accounts.spotify.com") 

get '/' do 
"Working"  
end 

post '/swap' do 

    # This call takes a single POST parameter, "code", which 
    # it combines with your client ID, secret and callback 
    # URL to get an OAuth token from the Spotify Auth Service, 
    # which it will pass back to the caller in a JSON payload. 

    auth_code = params[:code] 

    http = Net::HTTP.new(SPOTIFY_ACCOUNTS_ENDPOINT.host, SPOTIFY_ACCOUNTS_ENDPOINT.port) 
    http.use_ssl = true 

    request = Net::HTTP::Post.new("/api/token") 

    request.add_field("Authorization", AUTH_HEADER) 

    request.form_data = { 
     "grant_type" => "authorization_code", 
     "redirect_uri" => CLIENT_CALLBACK_URL, 
     "code" => auth_code 
    } 

    response = http.request(request) 

    # encrypt the refresh token before forwarding to the client 
    if response.code.to_i == 200 
     token_data = JSON.parse(response.body) 
     refresh_token = token_data["refresh_token"] 
     encrypted_token = refresh_token.encrypt(:symmetric, :password => ENCRYPTION_SECRET) 
     token_data["refresh_token"] = encrypted_token 
     response.body = JSON.dump(token_data) 
    end 

    status response.code.to_i 
    return response.body 
end 

post '/refresh' do 

    # Request a new access token using the POST:ed refresh token 

    http = Net::HTTP.new(SPOTIFY_ACCOUNTS_ENDPOINT.host, SPOTIFY_ACCOUNTS_ENDPOINT.port) 
    http.use_ssl = true 

    request = Net::HTTP::Post.new("/api/token") 

    request.add_field("Authorization", AUTH_HEADER) 

    encrypted_token = params[:refresh_token] 
    refresh_token = encrypted_token.decrypt(:symmetric, :password => ENCRYPTION_SECRET) 

    request.form_data = { 
     "grant_type" => "refresh_token", 
     "refresh_token" => refresh_token 
    } 

    response = http.request(request) 

    status response.code.to_i 
    return response.body 

end 

Задано:

SPTAuth.defaultInstance().tokenSwapURL = URL(string: SpotifyCredentials.tokenSwapURLSwap) 
SPTAuth.defaultInstance().tokenRefreshURL = URL(string: SpotifyCredentials.tokenSwapURLRefresh) 

Теперь пользователь не сможет войти в систему больше, и я получаю ошибку, размещенную на верхней части. Если я удалю tokenSwapURL и tokenRefreshURL, все будет работать снова, но Пользователь должен перезапустить каждые 60 минут.

Если я пытаюсь обновить токен с уже зарегистрированным пользователем, я получаю:

"No refresh token available in the session!"

if SPTAuth.defaultInstance().session != nil { 
     print("needs login") 
     SPTAuth.defaultInstance().renewSession(SPTAuth.defaultInstance().session, callback: { error, session in 
      if error != nil { 
       print("\(error?.localizedDescription)") // "No refresh token available in the session!" 
       return 
      } 
     }) 
} 

Что мне не хватает? Помощь очень ценится.

+0

Я использую API-адрес spotify –

+0

Вы решили это? У меня такая же проблема. –

+0

эй @ Маркус Джоханссон да. см. мой ответ –

ответ

1

Я был в состоянии создать маркер службы обновления для Spotify со следующими Git:

https://github.com/adamontherun/SpotifyTokenRefresh

Все, что вам нужно сделать, это следовать инструкциям Heroku в рамках проекта git.

enter image description here

Я попытался войти в контакт с автором проекта, но он был не в состоянии сказать мне, почему мой подход не работает, но его это. Все, что я могу оставить, это эта работа Deploy to Heroku.

1

Краткое описание: если ваш JSON-анализ корректно работает, проблема связана с неправильным JSON (на стороне сервера).


JSON текст не начать с массивом или объектом и опции, чтобы фрагменты не установлен

может быть брошен -х JSONSerialization.jsonObject(with:options:), который возвращает объект

фундаментной от данных JSON в data, или

nilпри возникновении ошибки.

уродлив JSON »nil вместо маркеров» текущих маркера получает nilled »результата: „пользователя не может войти больше“

Возможных объяснений для получения искаженной JSON включает в себя:

Обычно это связано с тем, что из вашего сервера выдается предупреждение, не помещая его в массив ответов. Например, в PHP некоторые «предупреждающие сообщения» не попадают в ваш массив, поэтому, когда вы, наконец, используете «echo json_encode ($ RESPONSE_ARR)», это не формат JSON. - https://stackoverflow.com/a/38680699/3419541

Из той же странице SO:

Вы должны отладить это в приложении IOS. Сначала преобразуйте данные в строку и распечатайте их и проверьте. Если строка выглядит хорошо, тогда распечатайте сами данные - иногда людям удается добавить 0 байт или управляющие символы или два байтовых байта порядка или что-то подобное, которые невидимы в строке, но не являются законными JSON. - https://stackoverflow.com/a/38681179/3419541

+0

Я попытался выполнить ваш ответ, но я не могу, потому что все работает в spotify Framework. Я не обрабатываю какой-либо JSON, все, что я делаю, - это получить информацию об идентификаторе API, если я хочу работать с или без службы обновления и с URL-адресом сервера. Это буквально так. Все остальное обрабатывается путем выделения. –

 Смежные вопросы

  • Нет связанных вопросов^_^