我在android上有一个连接到Liferay Portal后端的移动应用程序。有没有使用SAML2从Android应用程序登录的解决方案? Liferay SDK不提供saml支持。或者任何人都可以帮我提供一些我可以用来完成这项任务的资源吗?
谢谢!
我附上了关于我现在正在做什么的更多细节。 由于移动设备上没有SAML支持,因此我使用webview访问用户输入电子邮件和密码的登录页面。登录成功后,我想将来自webview的cookie与http客户端同步,以便能够从本机代码向API发出请求。
当页面加载完毕后,我调用方法在
中同步我的cookieCookieStore from a DataHolder class
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d(Consts.DONI_APP_DEBUG_TAG, "---> Page start loading: " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
syncCookiesFromAppCookieManager(url);
}
});
public void syncCookiesFromAppCookieManager(String url) {
CookieManager cookieManager = CookieManager.getInstance();
if (cookieManager == null) return;
RFC2109Spec cookieSpec = new RFC2109Spec();
String rawCookieHeader = null;
try {
URL parsedURL = new URL(url);
//Extract Set-Cookie header value from Android app CookieManager for this URL
rawCookieHeader = cookieManager.getCookie(parsedURL.getHost());
if (rawCookieHeader == null) return;
//Convert Set-Cookie header value into Cookies w/in HttpClient CookieManager
int port = parsedURL.getPort() == -1 ?
parsedURL.getDefaultPort() : parsedURL.getPort();
CookieOrigin cookieOrigin = new CookieOrigin( parsedURL.getHost(),
port,
"/",
false);
String[] sCookies = rawCookieHeader.split(";");
List<Cookie> appCookies = new ArrayList<Cookie>();
for(String c : sCookies){
String[] cc = c.split("=");
DataHolder.cookieStore.addCookie(cookieSpec.parse(
new BasicHeader("set-cookie", c),
cookieOrigin).get(0));
}
CookieSyncManager.getInstance().sync();
} catch (MalformedURLException e) {
// Handle Error
Log.d(Consts.DONI_APP_DEBUG_TAG, "Error 1!");
} catch (MalformedCookieException e) {
// Handle Error
Log.d(Consts.DONI_APP_DEBUG_TAG, "Error 2!");
}
}
毕竟,我将cookiestore附加到httpClient并发出请求: DefaultHttpClient httpClient = new DefaultHttpClient(); httpClient.setCookieStore(DataHolder.cookieStore);
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Content-type", "application/json");
try {
HttpResponse response = httpClient.execute(httpGet);
HttpEntity resEntity = response.getEntity();
if(resEntity != null){
String responseStr = EntityUtils.toString(resEntity).trim();
Log.d("LOG", "Response: " + responseStr);
}
}catch (IOException e){
e.printStackTrace();
}
我在请求之前测试了httpClient的cookie,并显示它们已附加,但请求返回登录html页面而不是来自api的响应。 我还用2个不同的webview测试了这个。我在第一个webview中登录,然后在第二个webview中加载api url并且它可以工作。
我做错了什么?我还注意到有很多类被弃用,但这是我在其他论坛上找到的与此相关的唯一资源。
非常感谢!