對Okta和Android沒有太多瞭解。有誰知道一個很好的教程,它展示瞭如何將Android應用程序連接到Okta框架。或者,我是否實施了SAML SSO實施,然後Okta與此相關聯?任何代碼示例都會受到讚賞 - 尤其是顯示Android通用SSO實現的代碼示例,如果存在這樣的情況。Android SSO Okta集成示例
回答
好吧,很多地面覆蓋在這裏和我沒有做的一些工作。但基本思想是,在服務器端(我們使用.Net),我們使用「kentor」創建了SAML通信層。我沒有與此工作,但想法是軟件溝通的客戶端身份提供商(IDP)的SSO(Okta例如)。 IDP客戶端通常必須提供具有安全信息且最終爲URL的XML元數據,並且向他們提供SSO XML元數據(對不起,我沒有在這部分工作!)。
基本上從那裏它是非常直接在Android的一面。最重要的是,上述交互產生了一個由SSO客戶端提供的URL,您將在Android端使用它創建一個webview,這將允許他們輸入他們的登錄信息進行驗證。
因爲我們專門爲客戶創建了一個白色標籤產品(您將在下面看到Constants.SINGLE_SIGNON_URL
),但是沒有什麼能夠阻止您在客戶通過組織代碼進行SSO後將URL返回給客戶在(我們現在正在努力)。換句話說,您存儲URL或根據哪個客戶生成URL,然後在設備向您傳遞組織代碼時返回該URL。該URL實際上是您的服務器,它重定向到SSO的IDP(Okta)登錄頁面。這是因爲OKTA的響應需要到您的服務器,最終它將通過重定向發回到您的webview。我們使用cookies來存儲所產生的用戶名,以允許正常的登錄過程。可能有很多不同的方式來做到這一點,Okta甚至提供本地移動設備功能,但客戶必須支持。
這裏是一個圖,希望能拼寫出這些高水平件:
該代碼僅覆蓋1),2)和5)上面的圖所示。 1)對WebView的調用非常明顯。 2)實際上是打到您的服務器的Constants.SINGLE_SIGNON_URL
的調用,它應該重定向到IDP頁面。當用戶在那裏登錄時,它會被髮送回服務(SP)並被重定向回WebView。再次,我們在cookie中存儲了一些內容,以便繼續我們的正常登錄。
一個關鍵是要認識到多次調用WebView的shouldOverrideUrlLoading()
。忽略除發送服務器URL之外的所有內容,此時您需要提取所需的數據(在我們的例子中是服務器驗證的登錄信息)。這在通話中可見GlobalState.getInstance().currentUserName = getCookieValue("_username" ,cookies);
大概不會很好地解釋這一點(而且已經過去了一個月左右!)。這裏是大部分的工作是做的SSOActivity的樣本:
public class SSOActivity extends Activity {
WebView webView;
private Button mCancel;
private Button mReset;
/**
* Grabs the specified variables out of the list of cookies
*
* @param fieldName
* @param cookies
* @return
*/
public String getCookieValue(String fieldName, final String cookies){
String CookieValue = null;
String[] cookiessplit = cookies.split(";");
for (String str : cookiessplit) {
if(str.contains(fieldName)) {
String[] value=str.split("=");
CookieValue = value[1];
break;
}
}
return CookieValue;
}
public void clearCookies() {
try {
android.webkit.CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
}
catch (Exception ex)
{
Utilities.logException(ex);
Utilities.logError("SSOActivity", "clearCookies() : " + ex.getMessage());
}
}
/**
* Cancels the SSO request in Webview
*
* @param view
*/
public void cancelSSOClick (View view) {
Utilities.logInfo("cancelSSOClick", "Cancel SSO click");
setResult(Activity.RESULT_CANCELED, null);
SSOActivity.this.finish();
}
/**
* Resets and deletes cookies and SSOUrl if one exists
*
* @param view
*/
public void resetSSOClick (View view) {
Utilities.logInfo("resetSSOClick", "Cancel SSO click");
setResult(Activity.RESULT_CANCELED, null);
clearCookies();
SSOActivity.this.finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setResult(Activity.RESULT_OK, null);
// Setup the web view. It will redirect to SSO site for login
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_sso);
mCancel = (Button)findViewById(R.id.cancelSSO);
mCancel.setTextColor(Color.WHITE);
mReset = (Button)findViewById(R.id.resetSSO);
mReset.setTextColor(Color.WHITE);
webView = (WebView) findViewById(R.id.ssoViewer);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setSupportZoom(false);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading (WebView view, String url) {
try {
// If coming from our system, then we need to check the cookie for username password, for
// some SSO this might be different than the base url. Check for both
if (url.equals(Constants.getBaseUrl()) || url.equals(Constants.SSO_RETURN_URL)) {
CookieManager cookieManager = CookieManager.getInstance();
final String cookies = cookieManager.getCookie(url);
GlobalState.getInstance().currentUserName = getCookieValue("_username" ,cookies);
SSOActivity.this.finish();
return true;
}
}
catch (Exception ex) {
GlobalState.getInstance().currentUserName = "";
GlobalState.getInstance().currentPassword = "";
setResult(Activity.RESULT_CANCELED, null);
SSOActivity.this.finish();
}
return false;
}
});
try {
webView.loadUrl(Constants.SINGLE_SIGNON_URL);
}
catch (Exception ex) {
Utilities.logException(ex);
Utilities.logError("SSOActivity", "onCreate(), webView.loadUrl(ssoUrl) : " + ex.getMessage());
}
}
}
這裏是XML支持活動的一個例子:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ssoViewerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/button_layout"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content"
android:gravity="center|bottom"
android:layout_alignParentBottom="true">
<Button
android:id="@+id/cancelSSO"
android:layout_marginTop="16dp"
android:layout_width="125dp"
android:layout_height="55dp"
android:layout_margin="5dp"
android:onClick="cancelSSOClick"
android:text="Cancel Login"
android:background="@drawable/button_login" />
<Button
android:id="@+id/resetSSO"
android:layout_marginTop="16dp"
android:layout_width="125dp"
android:layout_height="55dp"
android:layout_margin="5dp"
android:onClick="resetSSOClick"
android:text="Reset SSO"
android:background="@drawable/button_login"/>
</LinearLayout>
<WebView
android:id="@+id/ssoViewer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/button_layout" />
</RelativeLayout>
在代碼看起來像這樣別人調用它:
Intent viewIntent = new Intent(getActivity(), SSOActivity.class);
(getActivity()).startActivityForResult(viewIntent, Constants.SINGLE_SIGN_ON);
最後,你應該看到:
希望這會有所幫助!
tx,今天就來看看會不會讓你發貼 –
- 1. 與okta集成SSO
- 2. Struts 1.3 + Saml Okta SSO集成
- 3. 將Okta與Windows集成ACS
- 4. SSO如何與OKTA合作
- 5. Kerberos SSO集成
- 6. Moodle Drupal集成SSO
- 7. Spring集成示例
- 8. 將多個IDP與Okta集成
- 9. GreendaO與Sqlcipher集成示例
- 10. Ecwid SSO與django集成
- 11. 用於Facebook集成的SSO
- 12. AEM 6.2 SSO(SAML)集成
- 13. 與Apache的SSO集成
- 14. Spring集成示例:: Aggregator
- 15. ActiveMerchant集成使用示例?
- 16. CKEditor和elFinder集成示例
- 17. Applet和JSF集成 - 示例
- 18. ASP.net集成模式 - 示例
- 19. 貝寶集成示例
- 20. SSO集成(作爲身份提供商)
- 21. Umbraco會員與SAML Web SSO的集成
- 22. Disqus網站上的SSO集成
- 23. Facebook的Sso集成不工作
- 24. 如何在Xamarin中集成SSO登錄
- 25. OAM Webgate SSO與ASP.NET的集成
- 26. vanilla/codeigniter與jsconnect/SSO的登錄集成
- 27. 集成Lift ProtoUser與Facebook登錄/ SSO
- 28. Liferay與cas集成提供跨域SSO
- 29. PeopleSoft SSO集成的第三方
- 30. Auth0 SSO集成的目的是什麼?
對此有任何更新 –
其實,是的。我會試着花幾分鐘時間來將幾個小時內所做的一些代碼示例。還需要一些服務器端的工作,我沒有這樣做(我認爲這種差異很大)。 –
感謝一位夥伴,期待更新 –