- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对 Okta 和 Android 了解不多。有谁知道一个很好的教程,它展示了如何将 android 应用程序连接到 Okta 框架中。还是我实现 SAML SSO 实现,然后将 Okta 与之相关联?任何代码示例都值得赞赏 - 特别是显示通用 SSO 的 Android 实现的代码示例(如果存在的话)。
最佳答案
好吧,这里要讲很多基础知识,还有一些我没有做过的工作。但基本思想是在服务器端(我们使用 .Net)我们使用“kentor”创建了一个 SAML 通信层。我没有使用它,但想法是软件为 SSO(例如 Okta)传达客户端的身份提供者 (IDP)。 IDP 客户端通常必须提供具有安全信息和最终 URL 的 XML 元数据,并且您向他们提供您的 SSO xml 元数据(抱歉,我没有处理那部分!)。
基本上从那里开始,在 Android 方面就非常简单了。最重要的是,上述交互会生成 SSO 客户端提供的 url,您将在 Android 端使用该 url 来创建 webview,这将允许他们输入登录信息以进行验证。
我们对 URL 进行了硬编码,因为我们专门为客户创建了一个白标产品(您将在下面看到它作为 Constants.SINGLE_SIGNON_URL
)但是没有什么可以阻止您在之后将 URL 传回客户通过 SSO 的组织代码(我们正在努力)。换句话说,您存储 URL 或基于哪个客户生成 URL,然后在设备向您传递组织代码时返回该 URL。该 URL 实际上指向您的服务器,它重定向到 SSO 的 IDP (Okta) 登录页面。这是因为来自 OKTA 的响应需要转到您的服务器,最终它将通过重定向到您的 webview 发回。然后我们使用 cookie 存储生成的用户名以允许正常的登录过程。可能有很多不同的方法可以做到这一点,Okta 甚至提供了 native 移动设备功能,但客户必须支持它。
这是一张图表,希望能阐明其中的一些高级部分:
代码只涵盖上图中的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() );
}
}
}
这是支持 Activity 的 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);
最后是你应该看到的:
希望这对您有所帮助!
关于Android SSO Okta 集成示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34862159/
我有一个已集成 OKTA 的 React native ios 应用程序,但我还需要直接在我的应用程序中使用 OKTA 自定义登录页面,这样用户就不会重定向到 okta 页面进行登录。 我可以使用 @
我一直在研究针对 Okta REST API 的用户生命周期事件。 我对各种 Okta 用户状态感到困惑,特别是 STAGED、ACTIVE 和 PROVISIONED。我看过this diagram
我正在使用 Okta C# sdk 进行开发。我在 Okta 中创建了一些自定义用户配置文件属性。我能够创建用户并将值保存在自定义属性中。 但正如我所见,当您更新个人资料数据时,您必须再次提供所有详细
我正在使用 okta sign-in widget在我们的应用程序中对用户进行身份验证。问题是,当在 Safari 中选中“防止跨站点跟踪”时(FF 具有类似的设置),登录仍然有效,但单点登录、MFA
我想了解以下场景是否可以使用 Okta 开发人员帐户来完成。我想保护一个用 Python/Flask 编写的 API,该 API 旨在由另一个后端服务以编程方式访问。没有用户交互。到目前为止,我所能找
我喜欢使用 spring-security-saml2-service-provider 的想法 - 来自文档:https://docs.spring.io/spring-security/refer
如何在 Okta 中以编程方式实现 MFA?我的要求是这样的: 对于某些用户,我想使用 Okta Verify 和一些额外的安全问题。 对于其他一些用户,我想使用 Google 身份验证以及一些额外的
我们有一个绑定(bind)到 Active Directory 的 Okta 实例。所有用户都在 AD 中创建并输入 Okta。配置文件由 AD 掌握。我们已将几个自定义属性添加到 Okta 配置文件
我们有一个 Vault 集群设置,我们正在尝试使用 Okta 对 Vault 进行身份验证。已启用身份验证并对其进行配置: vault auth enable okta vault write aut
我想使用 okta java API 验证我的应用程序。当前根据给定的代码,我被重定向到 okta,我输入我的凭据,然后它会将我踢回应用程序,但我的要求是在中输入我的凭据我的登录屏幕并在验证和成功登录
Gentics Mesh 内置了对 Keycloak 的支持,但我想改用 Okta。 最佳做法是什么? 是否需要修改 Mesh 源代码? 或者也许我应该在中间件层处理身份验证? 或者我可以实现 Aut
我正在尝试使用 Okta's Sign-In Widget和 Okta API 来找出用户与哪些组相关联。 Okta API 返回用户关联的组,但我只能在从管理控制台转到它时使用它,所以这必须基于 O
使用 okta-signin-widget 和 okta-auth-js 有什么区别? 我可以说 okta-auth-js 提供了身份验证的所有功能,并且小部件使用这些功能 + 构建视觉效果吗? 最佳
因此,我尝试将 Okta 设置为身份提供商,并且我想使用服务提供商启动的工作流程登录到应用程序。我已在 Okta 中设置模板 SAML 2.0 应用程序,并在服务提供商上设置入口点和 SAML 证书。
我的 webflux api 中有一个 CORS webFilter,当我通过 postman 为飞行前检查 list 发出选项请求时,我得到了带有正确 header 的响应。但是,当我使用 Axio
从API docs尚不清楚,一旦停用,是否可以在Okta中激活用户。 我可以看到它们在停用后会变为已取消配置状态,而且我知道该用户将从任何应用程序中撤消(全部根据文档),但是我的问题在文档中没有得到回
我正在尝试从部署到 Azure 的 Kentor AuthServices 获取示例 MVC 应用程序,并使用 Okta 作为 IDP。我跳过了几个障碍,但偶然发现了 CryptographicExc
如何在没有电子邮件地址的情况下创建唯一的用户名? 当我如下发送 curl 请求时 curl -X POST \ 'https://xxxx.oktapreview.com/api/v1/users
我找到了一个使用 OKTA's Sign-in Widget 构建 Angular 4 应用程序的教程.太棒了,我向所有刚接触 OKTA 的人推荐它。 你可以在这个 URL 找到它: https://
我正在尝试在我的 React 应用程序上设置 Okta 身份验证。在客户端,我能够成功进行身份验证并获得访问 token 。但是,当我尝试使用 OktaJwtVerfier 对后端服务进行身份验证时,
我是一名优秀的程序员,十分优秀!