Q:什么是无流量超时注销? 用户登录成功后,超过一定时间(具体超时时长服务端可配置)没有触发内网资源访问,服务端会释放该用户所占用的并发授权。 注意:如果用户开启了免密功能,收到超时注销事件后,SDK内部会自动触发免密上线,此时超时注销功能会失效,反之,未开启免密功能,则客户端用户会被注销。 超时注销时间配置如下图所示: Q:SPA种子从哪获取?aTrust服务端版本 < 2.2.2登录零信任控制中心,打开业务管理,在左边栏选择全局配置,接入安全的条目下可以看到下载安全二维码的选项,点击后在页面中点击下载二维码和使用方法 此时会下载下来两个文件二维码服务器地址xxxx.png和使用说明.png, 只需关心二维码服务器地址xxxx.png文件即可,是一个二维码图片。 二维码使用方式 iOS可以通过相机的扫码功能,Android可以通过浏览器自带的扫码功能,对图片进行扫码识别,获取到图片中的JSON字符串{"model":1,"data":"xxxx"},将该字符串通过双域SDK提供的setSpaConfig接口进行设置,接口细节请参考API文档。 aTrust服务端版本 >= 2.2.2高版本设备支持两种模式:共享模式和一人一码模式。 查看模式配置方式:登录零信任控制中心,打开安全中心,在左边栏服务隐身-》安全码管理。 两种方式的SPA种子获取方法如下: 1. 共享模式获取方式一: 按下图点击“下载安全二维码” 此时会下载下来两个文件二维码服务器地址xxxx.png和使用说明.png, 只需关心二维码服务器地址xxxx.png文件即可,是一个二维码图片。 二维码使用方式 iOS可以通过相机的扫码功能,Android可以通过浏览器自带的扫码功能,对图片进行扫码识别,获取到图片中的JSON字符串{"model":1,"data":"xxxx"},将该字符串通过双域SDK提供的setSpaConfig接口进行设置,接口细节请参考API文档。 获取方式二: 使用方式参考"启用SPA"典型场景。 2. 一人一码模式按下图点击"击立即前往"进入用户目录 找到测试用户所在的目录,点击进入 选择用户,生成SPA安全码 选择显示SPA安全码 使用方式参考"启用SPA"典型场景。
Q:如何获取SDK日志?1. 通过sdk提供的api获取日志文件路径,开发者实现日志文件拷贝操作这种方法比较适合开发者集成SDK时,实现自身应用导出日志功能;方便普通用户使用线上APP遇到问题后只需在APP中导出日志给到APP研发人员即可。具体API如下: // Android 通过该api 获取log日志文件路径SFUemSDK.getInstance().getSDKLogDir();/** * @brief iOS获取SDK日志目录,SDK没有日志提交功能,需要应用将SDK日志上报或者分享 */- (NSString*)getSDKLogDir;2. 通过开发工具直接拷贝出日志文件这种方法比较适合集成SDK的开发人员,开发人员在集成SDK时遇到SDK相关问题,可以直接通过工具将日志文件拷贝出来给到SDK开发者(深信服SDK开发人员)协助排查问题。 在Android端,SDK 日志文件默认路径如下,开发者可以通过Android Studio 或 adb 命令将日志文件拷贝出来。 // 日志文件位于如下文件夹下/sdcard/Android/data/app包名/files/sangforlogs在iOS端,SDK默认会将日志文件会写入应用沙盒的Documents/sangforsdklogs目录下,可以通过在Info.plist配置来开启文件共享能力,如下字段: UIFileSharingEnabled = YES通过iTunes或者爱思助手等PC工具提取到日志文件 ios研发人员还可通过Xcode提取日志文件,Xcode->Window->Devices and Simulators->选择device->选择APP->download container,如下所示: 3. 在设备控制台通过终端管理的终端日志获取前两种方法比较适合集成SDK的开发者, 第三种方法比较适合针对普通用户。该方法存在一些局限性,需要满足以下条件才能正常获取到日志: 客户APP已经正常登录aTrust,在设备控制台的监控中心能看到该用户处于上线状态; 客户APP处于前台; 满足以上三个条件后,则可以在设备控制台->业务管理->终端管理->终端日志获取来获取日志,具体流程如下:
4. 在设备控制台通过webConsole获取日志如果设备控制台版本等于或者高于2.2.4,推介使用方式3更加简单 客户APP已经正常登录aTrust,在设备控制台的监控中心能看到该用户处于上线状态;
满足以上三个条件后,则可以在设备控制台通过webConsole 输入命令来获取日志信息,具体流程如下: 命令行中输入如下命令: // 获取用户名为lvjie 的 client idatrust_tool client get_client_id lvjie// 242 为 第一步获取的client idatrust_tool client get_client_log 242如上即完成获取当前登录lvjie帐号应用APP的日志。 接下来在文件管理 tab项 可以看到文件下载列表,下载即可。 Q:设备控制台开启了"用户账号首次登录强制修改密码",该如何集成SDK?当设备控制台开启了用户账号首次登录强制修改密码,APP调用SDK提供的登录接口时,会进行onAuthProgress的回调。Android 回调的认证类型为AUTH_TYPE_RENEW_PASSWORD,这里与二次辅认的实现一致,参考SDKDemo中SecondAuthActivity实现。 iOS端回调的认证类型为SFAuthTypeRenewPassword,参考MainApp中的SecondAuthViewController实现。 Q:支持从第三方认证域服务器(例如https, ldap, OAuth2.0等)获取票据进行认证吗?复用SFUemSDK.getInstance().startPasswordAuth(url,username,password)接口进行认证;
注意:其中username中需包含认证域做为后缀。如:用户名为test,认证域为@https, 则传递username为test@https 第三方认证域服务器认证结果中如若返回了一些数据信息,可通过解析认证结果中SFBaseMessage的serverInfo字段来获取。 认证域查看方式如下图所示:
Q:在SDK登录阶段,出现"选路失败"或"连接服务器超时"的提示,排查步骤?手机浏览器是否能正常打开aTrust 接入地址(如不能,则联系深信服一线工作人员); 检查手机系统时间是否与aTrust 设备时间一致(如不一致建议两端都与网络时间同步); 检查调用sdk登录接口传递的接入地址是否是通过onSetSpaConfig来获取的(必须通过该方式来获取);
如以上方式仍未解决,请提供SDK日志给深信服一线工作人员; Q:在SDK登录阶段,出现"隧道无法打开,因为没有配置任何隧道资源"的提示,排查步骤?Q:在SDK登录阶段,出现"授权已过期或未激活,请激活后再使用(75500000)"的提示,排查步骤?检查sdpc控制台系统管理->授权管理中授权是否过期或未激活;
Q:登录认证成功后,发现部分资源无法访问,排查步骤?通过ping/telnet,检查代理网关能否正常连通该资源对应的客户业务服务器;
如以上方式仍未解决,请提供SDK日志给深信服一线工作人员; Q:SDK登录阶段,出现"管理员未授权,您无权访问此应用"?Q:SDK认证成功后,为什么没有系统VPN标识了(Android状态栏有VPN图标或者小钥匙,iOS状态栏有VPN图标)?SDK使用的是应用级的VPN技术方案,VPN通道仅对当前应用有效,即只会代理集成SDK所在应用的资源请求, 其他应用的请求是无法代理的. 有系统VPN标识的是全局VPN技术方案,VPN通道对所有应用生效,目前SDK不兼容此模式; 两者实现原理不同,但是应用级VPN用户体验和安全性更佳。
Q:如果在使用vpn的过程中网络断开,会发送注销的事件吗?终端侧的网络断开时,是不会触发VPN的注销(发送退出登录事件),只有当终端用户主动注销或者被管理员强制让用户下线才会触发VPN的注销登录。 Q:如果免密失败后,回调注销事件,从注销事件回调中怎么区分是免密导致的注销?注销回调接口中会回调注销的类型SFLogoutType,其中免密导致的注销类型为LOGOUT_TYPE_TCIKET_AUTH_ERROR。 Q:现在免密接口没有回调通知了,应用如何知道什么时候可以访问资源?免密接口startAutoTicket返回true就表示可以访问资源了,如果返回false则需要重新进行主认证(如用户名密码登录) Q:认证成功后没有收到认证回调,如何排查?确认已经按照文档要求在调用认证接口前调用setAuthResultListener设置了认证回调 检查是否有调用setAuthResultListener(null)清除认证回调,如果有将其屏蔽再测试是否存在不回调的问题
注意: setAuthResultListener(null)清除回调Android端不建议放到Activity的onDestory里面实现,建议参考SDKDemo中做法,详见SDKDemo中PrimaryAuthActivity Q:免密认证是否有开关可以控制是否需要启用?服务端在2.2.6及以后版本支持免密开关,配置页面如下图: Q:iOS集成出现崩溃,然后打印出如下日志**2022-07-15 17:25:46.073873+0800 MainApp[2250:281838] [access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.**请查看iOS的开发准备章节,需要给Info.plist添加权限NSPhotoLibraryUsageDescription Q:SDK没有提供隧道状态监听接口,APP怎么判断隧道是正常的?当前SDK使用的是tcp应用级vpn技术,对资源请求会进行即时的代理转发,应用资源请求完成关闭链接后,代理的隧道链接也会关闭,不存在和服务端建立的长链接隧道,所以不需要隧道状态监听回调接口,用户可以通过getAuthStatus接口来获取认证状态,只要认证状态是AuthStatusAuthOk,SDK就会正常将用户的资源请求代理转往vpn服务器,故可以简单的使用getAuthStatus来判断“隧道”状态是否正常, 但要注意此接口不能代替注销的监听, 仍需注册注销监听回调, 确保App被注销时能及时收到到被注销的事件, 避免出现被注销后无感知导致资源无法访问的问题. Q:SDK是否有提供获取SDK版本号的接口?SDK提供了getSdkVersion接口用于获取SDK版本号 Q:SDK内部断线重连的机制是怎样的,应用是否需要关注?进程启动的第一次,应用需要做一次登录操作:可以先调用免密认证接口,返回免密成功后内部就会正常上线,此时就可以访问资源; 免密失败则需要使用主认证进行认证登录,登录完成后应用就可以访问资源了.后续只要确保一直有监听注销回调; 如果未收到注销回调,应用就可以认为隧道是正常的,可以随时请求资源; 如果收到了注销回调,则需要应用提示用户重新进行登录; 对于网络切换或者网络断开恢复等网络事件,sdk内部会自动处理,无需用户关注,如果应用确实需要获取状态来感知当前隧道是否正常,可以使用getAuthStatus来判断,只要认证状态是AuthStatusAuthOk就可以认为当前隧道状态是ok的. Q:Android SDK是否支持系统类DownloadManager下载?若下载外网资源,则可以通过DownloadManager下载. 若下载内网资源,则不支持DownloadManager下载.因为DownloadManager下载运行在系统独立的进程,TCP模式下SDK是应用级隧道,无法代理其网络请求,导致内网资源无法被访问并下载. Q:SDK初始化选择不同模式下授权占用情况?MODE_VPN模式: 无论集成SDK的APP是否在应用中心授权给用户, 用户都可以使用集成SDK的APP接入使用, 并且仅占用并发授权. MODE_VPN_SANDBOX模式: 只有当集成SDK的APP在应用中心授权给用户, 用户才可以使用集成SDK的APP接入使用, 并且占用并发授权和UEM移动版授权. Q:SDK认证成功后, 是否会代理集成SDK应用的所有网络请求?SDK认证成功后只会代理资源地址的网络请求, 资源地址是需要在服务端进行配置并关联给登录用户的, 非资源请求会走应用原有逻辑发往互联网. Q:同一个帐号可以在多少个设备上同时登录使用?同一个帐号同时在线的设备数目在服务端用户策略处是可配置的, 最多支持1000个设备同时登录. Q:Android怎么支持armeabi(非armeabi-v7a)?当前的SDK提供的aar支持直接修改文件夹的名称,来支持部分armeabi(非armeabi-v7a),步骤如下: 1.使用系统先打开aar文件,如图下图(有两处armeabi-v7a): 2.右键点击最外层armeabi-v7a文件夹,选择修改文件名修改成armeabi: 3.右键点击jni/armeabi-v7a文件夹,选择修改文件名修改成armeabi: 4.最后直接退出当前界面 Q:Android怎么支持使用go语言发送网络请求的App?当前go语言网络请求需要通过socks5来代理, 具体步骤如下: 通过反射获取SDK本地socks5代理端口 private long getVpnProxyPort() { try { Class clz = Class.forName( "com.sangfor.sdk.SFSecuritySDK"); Method method = clz.getDeclaredMethod( "getSocks5ProxyPort"); method.setAccessible( true); return ( long) method.invoke( null); } catch (Exception e) { SFLogN.error2(TAG, "get vpn port error.", "", e); } return 0;} 注意: getVpnProxyPort需要在登录成功,或者调用免密认证接口startAutoTicket返回true后调用 App使用go语言设置socks5代理的接口, 将网络请求代理到SDK的本地socks5代理, 其中代理服务器ip为127.0.0.1, 端口为第一步调用getVpnProxyPort获取的结果
|