= 3840

2016-11-26 2 views
7

TL; DR私が受けている:JSON text did not start with array or object and option to allow fragments not set.私がしようとしている場合は、トークンとNo refresh token available in the session!を受信しようとしている場合トークンを更新する。= 3840

私は私の資格情報に変更Spotifyは、が提供するHerokuのサーバとRubyスクリプトを使用しているセットアップにスウィフト3でのObjective-CのSpotifyのiOS SDKベータ-25のためのリフレッシュトークンをしようとしています。で設定し

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) 

今、ユーザーはもうログインできないと私はトップに掲載のエラーを受信して​​います。 tokenSwapURLtokenRefreshURLを削除すると、すべてが再び機能しますが、ユーザーは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

私はspotify APIを使用しています –

+0

これを解決しましたか?私は同じ問題を抱えています。 –

+0

ねえ@マークスヨハンソンはい。私の投稿された回答を参照してください –

答えて

1

私は次のようにGitとSpotifyはトークンリフレッシュサービスを作成することができましたgitプロジェクト内のHerokuリンク。

enter image description here

は、私はプロジェクトの著者と接触して取得しようとしましたが、私のアプローチは働いていなかった、なぜ彼は、私に言うことができませんでしたが、彼のです。私があなたに残すことができるのは、この作業ですDeploy to Herokuリンクです。

1

短い要約:あなたのJSON解析が正常に動作していると仮定すると、問題は不正な形式のJSON(サーバー側)です。


JSONテキストは、フラグメントが設定されていない可能にするために、配列やオブジェクトとオプションで起動しませんでした

はの JSONSerialization.jsonObject(with:options:)

A財団オブジェクトを返すによってスローすることができますdataのJSONデータまたは

nilエラーが発生した場合

代わりにトークン»現在のトークンの不正な形式のJSON»nilがnilled»結果取得:

を不正な形式のJSONを取得するための

可能性のある説明が含まれ、 『ユーザーはもうログインできません』

これは、通常、応答配列に入れないで、サーバーから何らかの警告メッセージがスローされるためです。たとえば、PHPでは、いくつかの "警告メッセージ"は配列に捕捉されないため、最終的に "echo json_encode($ RESPONSE_ARR)"を使用するとJSON形式ではありません。 - https://stackoverflow.com/a/38680699/3419541

同じSOページから:あなたはiOSアプリケーションでこれをデバッグする必要がある

。最初にデータを文字列に変換し、それを印刷してチェックします。文字列が正しく表示されている場合はデータ自体を印刷します。文字列には見えないが合法なJSONではない0バイトまたは制御文字、または2バイトのオーダーマーカーなどを追加することがあります。あなたがする必要があるのは、の指示に従うことです

​​

: - https://stackoverflow.com/a/38681179/3419541

+0

私はあなたの答えに従うように試みたが、私はちょうどすべてがspotifyフレームワークで働いているので、できません。私はJSONを一切扱っていません。私が行うのは、リフレッシュサービスとサーバーのURLの有無にかかわらず実行したい場合は、APIの情報を取得することだけです。それは文字どおりです。他はすべてスポットで処理されます。 –

関連する問題