package com.sap.jam.mobile_sdk.session; import android.content.Context; import android.content.SharedPreferences; import com.github.scribejava.core.builder.ServiceBuilder; import com.github.scribejava.core.model.OAuth1AccessToken; import com.github.scribejava.core.model.OAuthRequest; import com.github.scribejava.core.model.Response; import com.github.scribejava.core.model.Verb; import com.github.scribejava.core.oauth.OAuth10aService; import com.sap.jam.mobile_sdk.JamSDKDemoApp; import java.util.regex.Matcher; import java.util.regex.Pattern; public class JamAuthConfig { public static final String OAUTH_CALLBACK = "sapjamsdk://oauth-callback/jam"; public static final String KEY_OAUTH_TOKEN = "oauth_token"; public static final String KEY_OAUTH_VERIFIER = "oauth_verifier"; private static final String PREF_KEY = "jamAuth"; private static final String PREF_ACCESS_TOKEN = "accessToken"; private static final String PREF_ACCESS_SECRET = "accessSecret"; private static final Pattern SINGLE_USE_TOKEN_PATTERN = Pattern.compile("(?<=<single_use_token id=\")[^\"]+"); private OAuth10aService oauthService; private OAuth1AccessToken oauthToken; private static class Holder { private static final JamAuthConfig sharedInstance = new JamAuthConfig(); } public static JamAuthConfig instance() { return Holder.sharedInstance; } public boolean isLoggedIn() { return oauthToken != null; } public OAuth1AccessToken getOAuth10aAccessToken() { return oauthToken; } public OAuth10aService getOAuth10aService() { return oauthService; } // Configures the URLs required to perform OAuth 1.0a authentication and authorization to get a single use // access token. // Use this method for normal oauth clients public void configure(String server, String consumerKey, String consumerSecret) { configure(server, consumerKey, consumerSecret, null); } public void configure(String server, String consumerKey, String consumerSecret, String companyDomain) { oauthService = new ServiceBuilder() .apiKey(consumerKey) .apiSecret(consumerSecret) .callback(OAUTH_CALLBACK) .build(SAPJamApi.getInstanceForServer(server, companyDomain)); oauthToken = null; // Load Oauth tokens if exist Context appContext = JamSDKDemoApp.getAppContext(); SharedPreferences prefs = appContext.getSharedPreferences(PREF_KEY, 0); if (prefs.contains(PREF_ACCESS_TOKEN) && prefs.contains(PREF_ACCESS_SECRET)) { oauthToken = new OAuth1AccessToken(prefs.getString(PREF_ACCESS_TOKEN, null), prefs.getString(PREF_ACCESS_SECRET, null)); } } public void storeCredentials(OAuth1AccessToken accessToken) { this.oauthToken = accessToken; // TODO: store access token and secret in AccountManager or more securely // Using SharedPreferences for demonstration Context appContext = JamSDKDemoApp.getAppContext(); SharedPreferences.Editor prefEditor = appContext.getSharedPreferences(PREF_KEY, 0).edit(); prefEditor.putString(PREF_ACCESS_TOKEN, accessToken.getToken()); prefEditor.putString(PREF_ACCESS_SECRET, accessToken.getTokenSecret()); prefEditor.commit(); } public String getServerUrl() { return ((SAPJamApi)oauthService.getApi()).getServerUrl(); } // Must do this on background thread public String getSingleUseToken() { OAuth10aService service = JamAuthConfig.instance().getOAuth10aService(); final OAuthRequest request = new OAuthRequest(Verb.POST, JamAuthConfig.instance().getServerUrl() + "/v1/single_use_tokens", service); service.signRequest(JamAuthConfig.instance().getOAuth10aAccessToken(), request); final Response response = request.send(); String body = response.getBody(); Matcher matcher = SINGLE_USE_TOKEN_PATTERN.matcher(body); if (matcher.find()) { return matcher.group(0); } return null; } }