/
OAuth2AccessTokenManager.kt
67 lines (61 loc) · 2.24 KB
/
OAuth2AccessTokenManager.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package de.rheinfabrik.heimdall2
import de.rheinfabrik.heimdall2.grants.OAuth2Grant
import de.rheinfabrik.heimdall2.grants.OAuth2RefreshAccessTokenGrant
import io.reactivex.Single
import java.util.Calendar
open class OAuth2AccessTokenManager(
private val mStorage: OAuth2AccessTokenStorage
) {
// Public API
/**
* Returns the underlying storage.
*
* @return - An OAuth2AccessTokenStorage.
*/
fun getStorage(): OAuth2AccessTokenStorage = mStorage
/**
* Grants a new access token using the given OAuth2 grant.
*
* @param grant A class implementing the OAuth2Grant interface.
* @return - An Single emitting the granted access token.
*/
fun grantNewAccessToken(
grant: OAuth2Grant,
calendar: Calendar = Calendar.getInstance()
): Single<OAuth2AccessToken> =
grant.grantNewAccessToken()
.map {
if (it.expiresIn != null) {
val newExpirationDate = (calendar.clone() as Calendar).apply {
add(Calendar.SECOND, it.expiresIn)
}
it.copy(expirationDate = newExpirationDate)
} else {
it
}
}
.doOnSuccess { token ->
mStorage.storeAccessToken(
token = token
)
}
.cache()
/**
* Returns an Observable emitting an unexpired access token.
* NOTE: In order to work, Heimdall needs an access token which has a refresh_token and an
* expires_in field.
*
* @param refreshAccessTokenGrant The refresh grant that will be used if the access token is expired.
* @return - An Single emitting an unexpired access token.
*/
fun getValidAccessToken(refreshAccessTokenGrant: OAuth2RefreshAccessTokenGrant): Single<OAuth2AccessToken> =
mStorage.getStoredAccessToken()
.flatMap { accessToken ->
if (accessToken.isExpired()) {
refreshAccessTokenGrant.refreshToken = accessToken.refreshToken
grantNewAccessToken(refreshAccessTokenGrant)
} else {
Single.just(accessToken)
}
}
}