Именно так мы поступили в нашем приложении в соответствии с стандартами токенов обновления OAuth.
Шаг 1. Ваш API должен отправлять стандартный ответ токена аутентификации, как указано здесь а>
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
Шаг 2: Сохраните этот ответ в Shared Preferences / Local Cache / Local Database, мы использовали Shared Preferences (предполагая, что accountToken
является объектом класса, созданного из ответа токена аутентификации)
SharedPreferences.Editor editor = getContext().getSharedPreferences("AUTH_PREFS_NAME", Context.MODE_PRIVATE).edit();
editor.putString("AUTH_ACCESS_TOKEN_KEY", accountToken.getAccess_token());
editor.putString("AUTH_REFRESH_TOKEN_KEY", accountToken.getRefresh_token());
editor.putLong("AUTH_EXPIRES_IN_KEY", accountToken.getExpires_in());
editor.putLong("AUTH_TIME_SAVED_KEY", ((int) (System.currentTimeMillis() / 1000)));
editor.commit();
Шаг 3. Каждый раз, когда вам нужно использовать сохраненный токен доступа, убедитесь, что срок его действия не истек.
public boolean needsTokenRefresh(String accessToken) {
if (accessToken == null || accessToken.length() == 0) {
// no access token to refresh. Don't refresh.
return false;
}
SharedPreferences pref = mContext.getSharedPreferences("AUTH_PREFS_NAME", Context.MODE_PRIVATE);
String refreshToken = pref.getString("AUTH_REFRESH_TOKEN_KEY", null);
if (refreshToken == null || refreshToken.length() == 0) {
// no refresh token. Can't refresh.
return false;
}
Integer timeSaved = pref.getInt("AUTH_TIME_SAVED_KEY", 0);
if (timeSaved == 0) {
// No recording of having saved the token. Don't refresh.
return false;
}
long expiresIn = pref.getLong("AUTH_EXPIRES_IN_KEY", 0);
int now = (int) (System.currentTimeMillis() / 1000);
int timePassed = Math.abs(now - timeSaved);
boolean expired = false;
if (expiresIn <= timePassed) {
expired = true;
}
return expired;
}
Если needsTokenRefresh()
возвращает false
, используйте сохраненный токен аутентификации. Если он возвращает true
, переходите к следующему шагу.
Шаг 4. Выполните вызов Auth еще раз с grant_type
, установленным как refresh_token
, как указано в стандартах
Шаг 5. Вызов аутентификации должен возвращать стандартный ответ аутентификации, как описано в шаге 1, с обновленным токеном и новым refresh_token
person
adnanyousafch
schedule
22.10.2017