Я с нетерпением жду, чтобы реализовать приложение, которое подключается к Spotify. Чтобы использовать службы Spotify, мне нужен токен, который я могу получить с помощью Spotify SDK, однако этот токен предназначен для быстрого истечения срока действия не для долгосрочного использования. В веб-API я могу совершать звонки с моего сервера, чтобы получить новые токены доступа через refresh_token. Я знаю, что это должно быть сделано на сервере вызовов на сервер. Но я не знаю, как мне управлять информацией, предоставляемой Android Spotify SDK, чтобы получить refresh_token с сервера. Я даже не знаю, может ли это быть достигнуто через Spotify SDK или мне придется реализовать всю авторизацию. Я искал информацию в Интернете, но я не могу найти информацию, связанную с этой темой. Надеюсь, кто-то может помочь.Spotify долгосрочный логин с Android SDK
ответ
В принципе, если вам нужен токен обновления (токен, предоставляемый SDK, длится один час, а затем вы должны запросить другой), вам нужно использовать веб-api для получения этого токена. В этом случае вы не будете использовать SDK для любой части процесса аутентификации. Технически вам не нужно использовать серверный компонент сервера для передачи секретного пароля Spotify server auth, это просто лучшая практика (безопасность), чтобы избежать жесткого кодирования секретности в вашем приложении, но технически нет ничего, что мешало бы вам делать все серверы app_spotify authentication steps, использующие соответствующие вызовы web-api.
Несколько месяцев назад я разработал приложение, которое также использует службы Spotify. Так как я хотел запросить звуковые функции песни, мне пришлось использовать Web-API Spotify, а SDK от Spotify Android SDK пока не представил. Когда я реализовал приложение, я не думал об этом слишком много, поэтому каждый раз, когда мне нужно делать запросы, я снова получаю токен доступа. Вы можете получить токен, используя следующий код, внутри строки json также есть свойство expires_in, которое сообщает вам, сколько секунд токен истекает, поэтому вам будет легко достичь того, чего вы хотите с небольшими изменениями.
private String getAccessTokenFromJsonStr(String spotifyJsonStr) throws JSONException {
final String OWM_ACCESS_TOKEN = "access_token";
String accessToken;
try {
JSONObject spotifyJson = new JSONObject(spotifyJsonStr);
accessToken = spotifyJson.getString(OWM_ACCESS_TOKEN);
} catch (JSONException e) {
Log.e(LOG_TAG, e.getMessage(), e);
e.printStackTrace();
}
return accessToken;
}
private String getSpotifyAccessToken(){
String response;
String accessToken;
try {
String serviceURL = "https://accounts.spotify.com/api/token";
URL myURL = new URL(serviceURL);
HttpsURLConnection myURLConnection = (HttpsURLConnection) myURL.openConnection();
String userCredentials = "YOUR_USER_CREDENTIALS:YOUR_USER_CREDENTIALS";
int flags = Base64.NO_WRAP | Base64.URL_SAFE;
byte[] encodedString = Base64.encode(userCredentials.getBytes(), flags);
String basicAuth = "Basic " + new String(encodedString);
myURLConnection.setRequestProperty("Authorization", basicAuth);
myURLConnection.setRequestMethod("POST");
myURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
myURLConnection.setUseCaches(false);
myURLConnection.setDoInput(true);
myURLConnection.setDoOutput(true);
System.setProperty("http.agent", "");
HashMap postDataParams = new HashMap<String, String>();
postDataParams.put("grant_type", "client_credentials");
OutputStream os = myURLConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
response = "";
int responseCode=myURLConnection.getResponseCode();
Log.d(LOG_TAG, "response code is " + responseCode);
if (responseCode == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br=new BufferedReader(new InputStreamReader(myURLConnection.getInputStream()));
while ((line=br.readLine()) != null) {
response+=line;
}
}
else {
response="";
String errLine;
String errResponse = "";
BufferedReader br=new BufferedReader(new InputStreamReader(myURLConnection.getErrorStream()));
while ((errLine=br.readLine()) != null) {
errResponse += errLine;
}
Log.d(LOG_TAG, "error response is " + errResponse);
}
Log.d(LOG_TAG, "response is " + response);
} catch (Exception e){
e.printStackTrace();
}
String accessTokenJsonStr = response.toString();
try {
accessToken = getAccessTokenFromJsonStr(accessTokenJsonStr);
return accessToken;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
Моя проблема заключается в том, что запрашивающий другой маркер не может быть сделано с помощью Android SDK (или, если это может быть сделано, я не знаю, как). Чтобы получить еще один токен, я должен использовать активность, предоставляемую SDK. Я не могу сделать это в фоновом режиме, и это моя цель. Мое текущее решение не использует SDK для авторизации вообще и реализует его через веб-API. –
Вы можете получить новый токен, да через свою деятельность или веб-просмотр. Это тот же самый призыв к действию, что и обработка на их стороне (активность веб-просмотра или активность их приложений) зависит от того, установлено ли на устройстве приложение Spotify. Однако не должно быть проблем с использованием их намерений/действий, поскольку после того, как вы вошли в систему после того, как учетные данные будут кэшированы, пользователю больше не будет представлено действие входа. Просто спиннер на полсекунды, а затем вы получите новый токен. Никаких дополнительных подсказок, если вы не запрашиваете никаких дополнительных разрешений, чем вы сделали при предыдущем вызове. –
Это работает, если пользователь имеет свой экран. Я пробовал называть Activity в фоновом режиме, и он не работает для меня. –