BBASMAuthorizeProtocol.h 19.9 KB
//
//  BBASMAuthorizeProtocol.h
//  SWAN
//
//  Created by baidu on 2018/10/25.
//  Copyright © 2018 baidu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <Pyramid/Pyramid.h>
#import "BBASMAuthorizeAdapterProtocol.h"
#import "BBASMPluginDef.h"

#define BBASMC_AuthorizeScopeDidChangeNotification BBASM_UNCONFUSED_STR_METHOD(@"U1dBTkF1dGhvcml6ZVNjb3BlRGlkQ2hhbmdlTm90aWZpY2F0aW9u") //BBASMAuthorizeScopeDidChangeNotification           //用户权限状态修改

typedef NS_ENUM(NSUInteger, BBASMAuthorizeError) {
    BBASMAuthorizeErrorUserDeny,               //!< 用户拒绝
    BBASMAuthorizeErrorNetwork,                //!< 网络错误
    BBASMAuthorizeErrorSystemDeny,             //!< 系统拒绝
    BBASMAuthorizeErrorInternal,               //!< 内部错误,比如服务器参数错误异常等
    BBASMAuthorizeErrorBduss,                  //!< 未登录错误
    BBASMAuthorizeErrorNoData                  //!< 获取数据失败
};

/**
 *  授权状态
 */
typedef NS_ENUM(NSUInteger, BBASMAuthorizeScopeStatus) {
    BBASMAuthorizeScopeStatusAllow,                    //!< 成功
    BBASMAuthorizeScopeStatusTryLoginSucceed,          //!< 未登录状态,变更登录状态成功
    BBASMAuthorizeScopeStatusTryLoginError,            //!< 未登录状态,变更登录状态失败
    BBASMAuthorizeScopeStatusUserDenyError,            //!< 用户拒绝
    BBASMAuthorizeScopeStatusNetworkError,             //!< 网络错误
    BBASMAuthorizeScopeStatusNoDataError,              //!<获取数据失败
    BBASMAuthorizeScopeStatusUnHandle,                 //!< 未处理:目前是在后台时需要弹框,不弹框返回该值
    BBASMAuthorizeScopeStatusSystemDenyError,          //!< 系统拒绝
    BBASMAuthorizeScopeStatusInternalError             //!< 内部错误
};

typedef NS_ENUM(NSUInteger, BBASMLoginSceneType) {
    BBASMLoginSceneTypeLoginApi,
    BBASMLoginSceneTypeLoginButton,
    BBASMLoginSceneTypeCheckSession,
    BBASMLoginSceneTypeGetLoginCode,
    BBASMLoginSceneTypeGetPhoneNumberApi,
    BBASMLoginSceneTypeGetPhoneNumberButton,
    BBASMLoginSceneTypeGetUserInfoApi,
    BBASMLoginSceneTypeGetUserInfoButton
};

typedef NS_ENUM(NSUInteger, BBASMAuthorizeProcessType) {
    BBASMAuthorizeProcessTypeCreate,              // 起点
    BBASMAuthorizeProcessTypeLogin,               // pass 登录
    BBASMAuthorizeProcessTypeGetLoginCodeStart,   // 获取loginCode起点
    BBASMAuthorizeProcessTypeGetStoken,           // 获取stoken
    BBASMAuthorizeProcessTypeRequestLoginCode,    // 请求loginCode
    BBASMAuthorizeProcessTypeRequestModifyScope,  // 请求更改授权
    BBASMAuthorizeProcessTypePhoneNumberLogin,    // 获取手机号触发手机号登录
    BBASMAuthorizeProcessTypeRequestOpenData,     // 请求openData
    BBASMAuthorizeProcessTypeCheckScope,          // 确认鉴权
    BBASMAuthorizeProcessTypeRequestCheckSession, // 发checkSession请求
    BBASMAuthorizeProcessTypeSuccess,             // 终点(成功)
    BBASMAuthorizeProcessTypeFail                 // 终点(失败)
};

typedef void(^BBASMAuthorizeMapCallback)(NSDictionary *dict);
typedef void(^BBASMAuthorizeDeterminatedCallback)(BOOL allow, NSDictionary *responseDictionary);
typedef void(^BBASMAuthorizeErrorCallback)(NSString *errorStatus, NSString *errorMessage, NSDictionary *responseDictionary); //返回错误类型,如果有服务器数据,则附加服务器数据
typedef void(^BBASMAuthorizeScopeCallback)(BBASMAuthorizeScopeStatus status, NSDictionary *dict); //直接修改授权scope失败返回回调,status表示错误类型,dict表示错误信息
/// 集中授权,成功回调
typedef void(^BBASMMultiAuthorizeSuccessCallback)(void);
///// 集中授权,失败回调
typedef void(^BBASMMultiAuthorizeErrorCallback)(NSString *errorCode, NSString * errorMessage);
/// 授权过程回调
typedef void(^BBASMAuthorizeProcessCallback)(BBASMAuthorizeProcessType processType, NSDictionary *processInfo);

extern NSString *const kBBASMAuthorizeScopeFaceVerify;             // 人脸校验授权
extern NSString *const kBBASMAuthorizeScopeFaceImage;              // 活体检测授权
extern NSString *const BBASMAuthorizeScopeChangeMenuAppearance;    // 改变胶囊按钮样式权限
extern NSString *const BBASMAuthorizeScopeHideMenu;                // 设置胶囊是否隐藏
extern NSString *const BBASMAuthorizeScopeGetOpenBDUSS;            // 获取openBUDSS
extern NSString *const BBASMAuthorizeScopeGetUnionBDUSS;           // 获取联盟账号的openBUDSS
extern NSString *const BBASMAuthorizeScopeQuickLogin;              // 一键登录
extern NSString *const BBASMAuthorizeScopeSetAccountAvatar;        // 设置百度账户头像
extern NSString *const BBASMAuthorizeScopeFavorBtn;                // 关注button组件
extern NSString *const BBASMAuthorizeScopeBencharmark;             // benchmark稳定性权限
extern NSString *const BBASMAuthorizeScopeWebViewExtraOperation;   // 拦截webview组件url重定向及添加UA
extern NSString *const kBBASMAuthorizeScopeShowSMSPanel;           // 打开编辑短信的鉴权
extern NSString *const BBASMAuthorizeScopeAddToDesktop;            // 添加到桌面能力的鉴权

#define BBASMC_AuthorizeScopeBaseKey @"snsapi_base"                //默认key
#define BBASMC_AuthorizeScopeUserInfoKey @"snsapi_userinfo"        //用户信息
#define BBASMAuthorizeScopeUserInfoAPIKey @"scope_userinfo_api"    //用户信息-api调用
#define BBASMC_AuthorizeScopeLoginAPIKey  @"scope_login_api"       //登录接口-api调用
#define BBASMC_AuthorizeScopeUserLocationKey @"mapp_location"      //地理位置
#define BBASMC_AuthorizeScopeCamera @"mapp_camera"                 //相机
#define BBASMC_AuthorizeScopeMobile @"mobile"                      //手机号
#define BBASMAuthorizeScopeMobileAPIKey @"scope_mobile_api"        //手机号-api调用
#define BBASMC_AuthorizeScopeWritePhotosAlbumKey @"mapp_images"    //保存到相册
#define BBASMC_AuthorizeScopeGetBdussKey @"mapp_i_get_bduss"       //获取bduss
#define BBASMC_AuthorizeScopePaymentKey  @"mapp_i_polymepayment"   //钱包支付
#define BBASMC_AuthorizeScopeGetHistory  @"mapp_i_get_history"     //获取历史
#define BBASMC_AuthorizeScopeGetFavor @"mapp_favorite"               //小程序关注与取消
#define BBASMC_AuthorizeScopeDeleteHistory @"mapp_i_delete_history"          //删除历史
#define BBASMC_AuthorizeScopeChooseAddress @"mapp_choose_address"          //收货地址
#define BBASMC_AuthorizeScopeChooseInvoice @"mapp_choose_invoice"          //获取发票
#define BBASMC_AuthorizeScopeBdSystemInfo  @"mapp_i_get_common_sys_info"          //获取系统信息
#define BBASMC_AuthorizeScopeRecord @"mapp_record"                 //获取系统麦克风权限
#define BBASMC_AuthorizeScopeLivePlayer @"mapp_i_live_player"             //获取直播权限信息
#define BBASMC_AuthorizeScopePageTrans @"mapp_i_baiduapp_page_trans"              //页面跳转
#define BBASMC_AuthorizeScopeAdWebPage @"mapp_i_open_adweb"              //小程序打开广告落地页鉴权
#define BBASMC_AuthorizeScopeOpenApp @"scope_open_app"                //打开App
#define BBASMC_AuthorizeScopeAdLoading @"mapp_i_open_adlanding"              //打开需要鉴权的广告落地页,不同于AD 组件的调用
#define BBASMC_AuthorizeScopeThirdLogin @"mapp_i_login"             //三方登录
#define BBASMC_AuthorizeScopeStoken @"mapp_i_get_stoken"                 //获取stoken
#define BBASMC_AuthorizeScopeReadContacts @"mapp_i_read_contacts"           //获取手机通讯录
#define BBASMAuthorizeScopeCheckReadContactsAuthorize @"scope_phone_contact_authorize" // 检测是否有通讯录权限
#define BBASMC_AuthorizeScopeAppDownload  @"mapp_i_app_download"          //跳转appStore
#define BBASMC_AuthorizeScopeSendBroadCast @"mapp_i_send_broadcast"          //小程序向宿主透传数据通道
#define BBASMC_AuthorizeScopeShareURLEditable @"mapp_i_share_update_linkurl"       //分享URL是否可由小程序自定义
#define BBASMC_AuthorizeScopeGetRealNameInfo @"ppcert"        //获取实名信息
#define BBASMC_AuthorizeScopeConfirmClose @"mapp_confirm_close"           // 挽留弹窗授权
#define BBASMC_AuthorizeScopeCTSDebug @"mapp_cts_debug"               //CTSDebug
#define BBASM_AuthorizeScopeGetChannelID @"scope_get_channel_id"      // 获取宿主app渠道号
#define BBASMC_AuthorizeScopePredownload @"mapp_pre_download"      // 预下载小程序/游戏包
#define BBASM_AuthorizeScopeMutiAuthorize @"scope_multi_authorize"     // 集中授权端能力
#define BBASMC_AuthorizeScopeShareWebUrl @"mapp_i_share_update_weburl"  // web化页面分享
#define BBASM_AuthorizeScopeGetUUAPInfo @"mapp_uuap_info"    // 获取uuap cookie内容的能力
#define BBASMC_AuthorizeScopeSubscribe @"subscribe" // 订阅通知
#define BBASMC_AutherizeScopeStreamTTS @"scope_stream_tts" // TTS 播报能力
#define BBASMC_AuthorizeScopeMapCustomStyle @"mapp_i_map_custom_style"   // 地图个性化能力
#define BBASMC_AuthorizeScopeWalletRiskControlData @"mapp_wallet_risk_control_info"   // 获取钱包风控信息授权
#define BBASMC_AuthorizeScopeWallet @"mapp_request_duxiaoman" // 百度钱包直连支付端能力调起方式鉴权
#define BBASMC_AuthorizeScopeAliPay @"mapp_request_alipayment" // 支付宝直连支付端能力调起方式鉴权
#define BBASMC_AuthorizeScopeWeChatPay @"mapp_request_wechatpayment" // 微信直连支付端能力调起方式鉴权
#define BBASMC_AuthorizeScopeThirdPay @"scope_request_thirdpayment"  // 新直连支付,微信/支付宝合并
#define BBASM_AuthorizeScopeSecuritySDK @"scope_call_securitysdk"   // 安全组sdk的鉴权
#define BBASM_AuthorizeScopeDisableSwipeBack @"scope_disable_swipe_back"   // 页面禁止全屏右滑鉴权
#define BBASM_AuthorizeScopeCalendar  @"scope_calendar"  // 添加/删除日历事件 (在系统日历中)
#define BBASM_AuthorizeScopeGetDeviceInfo  @"scope_get_device_info"  // 获取设备信息
#define BBASMAuthorizeScopeWebWindowPayProtected @"scope_web_window_pay_protected" // 半屏web容器保障类型鉴权
#define BBASMAuthorizeScopeCustomNavigationBar @"mapp_i_custom_navigation_bar" // 导航栏自定义不显示返回按钮鉴权
#define BBASMAuthorizeScopeCustomScreenshot @"mapp_custom_screenshot_image" // 获取截屏图片及屏蔽截屏分享鉴权
#define BBASMAuthorizeScopeRequestSubscribeMessage @"mapp_request_subscribe_message" // 去掉订阅消息API调起渠道限制鉴权
#define BBASMAuthorizeScopeEmitAppClose @"mapp_emit_app_close" // 发送appclose消息限制鉴权
#define BBASMAuthorizeScopeShowModalPage @"mapp_show_modal_page" // 展示全屏弹窗鉴权


//ERROR
#define kBBASMCallBackResultBaseCodeStatus         @"10000"

#define kBBASMCallBackResultInternalErrorStatus    @"10001"
#define kBBASMAuthorizeResultInternalErrorMSG      @"internal error" //内部错误

#define kBBASMCallBackResultNetworkErrorStatus     @"10002"
#define kBBASMAuthorizeResultNetworkErrorMSG       @"network error" //网络请求失败

#define kBBASMCallBackResultDenyErrorStatus        @"10003"
#define kBBASMAuthorizeResultDenyErrorMSG          @"user deny" //用户拒绝

#define kBBASMCallBackResultBdussErrorStatus       @"10004"
#define kBBASMAuthorizeResultBdussErrorMSG         @"user not logged in" // 账号失效

#define kBBASMCallBackResultSystemDenyErrorStatus  @"10005"
#define kBBASMAuthorizeResultSystemDenyErrorMSG    @"system deny" //系统拒绝

#define kBBASMCallBackResultNoDataErrorStatus      @"10006"
#define kBBASMAuthorizeResultNoDataErrorMSG        @"no data" //请求server成功,数据为空

#define kBBASMCallBackBaiduAccountErrorStatus      @"10007"
#define kBBASMCallBackBaiduAccountErrorMSG         @"is not baidu account" // 当前是没有接入百度账号的宿主

#define kBBASMCallBackResultSessionKeyExpiredErrorStatus     @"10009"
#define kBBASMAuthorizeResultSessionKeyExpiredErrorMSG       @"session key expired" // session_key过期


#define kBBASMAuthorizeResultSucceedMSG            @"authorize succeed"
#define kBBASMAuthorizeResultFailMSG               @"authorize fail"

#define kBBASMAuthorizeResultErrorKey              @"errno"
//ERROR END

/// 获取权限调起的来源key
extern NSString * const BBASMAuthorizeInvokeSource;
/// 获取权限调起的来源组件key
extern NSString * const BBASMAuthorizeFromSource;
/// Button调起获取权限
extern NSString * const BBASMAuthorizeInvokeSourceButton;
/// api调起获取权限, 同时这个也是默认的调起方式
extern NSString * const BBASMAuthorizeInvokeSourceApi;
/// scope 对应的key
extern NSString * const kBBASMAuthorizeScopeKey;

///需要区分授权错误类型的错误信息前缀
extern NSString *const BBASMAuthorizeFailLocationPrefix; //获取地位位置授权失败,错误信息前缀
extern NSString *const BBASMAuthorizeFailCameraPrefix;   //相机授权失败,错误信息前缀
extern NSString *const BBASMAuthorizeFailRecorderPrefix; //录音授权失败,错误信息前缀

typedef enum : NSUInteger {
    BBASMAuthorizeItemGradeAlways =    1,
    BBASMAuthorizeItemGradeLocalUser = 2,
    BBASMAuthorizeItemGradeNever =     3
} BBASMAuthorizeItemGrade;

@protocol BBASMUpdateModuleAdapterProtocol;

AliasService(BBASMAuthorizeProtocol, bba_MNPAuthorize)
@protocol BBASMAuthorizeProtocol <NSObject>

/**
 * @brief 尝试触发登录用户
 *
 * @param appId 应用ID
 * @param forceLogin 宿主平台未登录情况下,是否强制弹登录框
 * @param succeedCallback 成功登陆执行的回调
 * @param errorCallback 登陆失败执行的回调
 */
+ (void)checkAndTryLoginUserAppId:(NSString *)appId
                            force:(BOOL)forceLogin
                          succeed:(dispatch_block_t)succeedCallback
                            error:(dispatch_block_t)errorCallback;

/**
 * @brief 尝试触发登录用户
 *
 * @param appId 应用ID
 * @param forceLogin 宿主平台未登录情况下,是否强制弹登录框
 * @param succeedCallback 成功登陆执行的回调
 * @param errorCallback 登陆失败执行的回调
 * @param processCallback 流程回调
 */
+ (void)checkAndTryLoginUserAppId:(NSString *)appId
                            force:(BOOL)forceLogin
                          succeed:(dispatch_block_t)succeedCallback
                            error:(dispatch_block_t)errorCallback
                          process:(BBASMAuthorizeProcessCallback)processCallback;

/**
 *  请求alert信息,如果不需要弹框则直接返回. 本地权限bduss可以传nil
 *
 */
+ (void)requestScope:(NSString *)scope
               appID:(NSString *)appID
             succeed:(BBASMAuthorizeMapCallback)succeedCallback
               error:(BBASMAuthorizeErrorCallback)errorCallback;

/**
 * @brief 确认权限
 *
 * @param appID 应用ID
 * @param scope 权限名
 * @param succeedCallback 成功登陆执行的回调
 * @param errorCallback 登陆失败执行的回调
 * @param processCallback 流程回调
 */
+ (void)requestScope:(NSString *)scope
               appID:(NSString *)appID
             succeed:(BBASMAuthorizeMapCallback)succeedCallback
               error:(BBASMAuthorizeErrorCallback)errorCallback
             process:(BBASMAuthorizeProcessCallback)processCallback;

/**
 * @brief 请求scope权限信息
 * @param scope scope
 * @param appID appID
 * @param source 点击的来源,目前两个button,或者api调用
 * @param succeedCallback succeedCallback
 * @param errorCallback errorCallback
 */
+ (void)requestScope:(NSString *)scope
               appID:(NSString *)appID
        invokeSource:(NSString *)source
             succeed:(BBASMAuthorizeMapCallback)succeedCallback
               error:(BBASMAuthorizeErrorCallback)errorCallback;
/**
 *  确认登录状态
 *
 */
+ (void)checkLoginStateClient:(id<BBASMAppIdentifyInfoAdapterProtocol>)info
                      succeed:(BBASMAuthorizeMapCallback)succeedCallback error:(BBASMAuthorizeMapCallback)errorCallback;

/**
 *  获取用户授权信息列表_使用缓存
 *
 */
+ (void)getAppIDActionListClientEx:(NSString *)clientID
                           succeed:(BBASMAuthorizeMapCallback)succeedCallback
                             error:(BBASMAuthorizeErrorCallback)errorCallback;

/**
 *  获取用户授权信息列表_可配置是否使用缓存
 *
 */
+ (void)getAppIDActionListClientEx:(NSString *)appKey
                           succeed:(BBASMAuthorizeMapCallback)succeedCallback
                             error:(BBASMAuthorizeErrorCallback)errorCallback
                          useCache:(BOOL)useCache;

/**
 *  修改权限
 *
 */
+ (void)modifyAuthorizeScopeByAppID:(NSString *)appID
                           pluginID:(NSString *)pluginID
                              scopes:(NSArray *)scopes
                       operatorType:(BBASMAuthorizeOperatorType)opType
                        requestType:(BBASMAuthorizeRequestType)requestType
                            succeed:(BBASMAuthorizeDeterminatedCallback)succeedCallback
                              error:(BBASMAuthorizeScopeCallback)errorCallback;

/**
 *  修改权限,带过程回调
 *
 */
+ (void)modifyAuthorizeScopeByAppID:(NSString *)appID
                           pluginID:(NSString *)pluginID
                             scopes:(NSArray *)scopes
                       operatorType:(BBASMAuthorizeOperatorType)opType
                        requestType:(BBASMAuthorizeRequestType)requestType
                            succeed:(BBASMAuthorizeDeterminatedCallback)succeedCallback
                              error:(BBASMAuthorizeScopeCallback)errorCallback
                            process:(BBASMAuthorizeProcessCallback)processCallback;

/**
 *  获取 swan id
 *
 */
+ (void)getBBASMId:(NSString *)appID
          succeed:(BBASMAuthorizeMapCallback)succeedCallback
            error:(BBASMAuthorizeMapCallback)errorCallback;


/**
 *  获取开放数据, 成功的话,返回 相关的服务器透传数据。 失败的话,返回错误
 *
 *  @params params NSDictionary    key: scope
 *
 */
+ (void)getOpenData:(NSString *)appId
             appKey:(NSString *)appKey
           pluginID:(NSString *)pluginID
             params:(NSDictionary *)params
            succeed:(BBASMAuthorizeMapCallback)succeedCallback
              error:(BBASMAuthorizeErrorCallback)errorCallback;

+ (void)getOpenData:(NSString *)appId
             appKey:(NSString *)appKey
           pluginID:(NSString *)pluginID
             params:(NSDictionary *)params
            succeed:(BBASMAuthorizeMapCallback)succeedCallback
              error:(BBASMAuthorizeErrorCallback)errorCallback
            process:(BBASMAuthorizeProcessCallback)processCallback;

/// 请求账号信息
/// @param appID 小程序ID
/// @param scope opendata scope
/// @param succeedCallback 成功回调
/// @param errorCallback 失败回调回调
+ (void)requestOpenDataWithAppID:(NSString *)appID
                           scope:(NSString *)scope
                         succeed:(BBASMAuthorizeMapCallback)succeedCallback
                           error:(BBASMAuthorizeErrorCallback)errorCallback;

#pragma mark - ut

/**
 * 数据请求结点,存储用于要请求的结点对应的模型数据,用于发起请求的参数获取key 为要请求的节点名,其中为 @"accredit":表示授权相关数据
 * value 为遵守 BBASMUpdateModule 协议的模型对象
 */
+ (NSMutableDictionary<NSString *,id<BBASMUpdateModuleAdapterProtocol>> *)moduleMap:(NSString *)appID;

/**
 * @brief 检查本地权限列表授权结果
 * @param scopeKey 查询的授权key
 * @param appID 小程序appId
 * @return YES 已授权 | NO 未授权
 */
+ (BOOL)checkAuthorizeFromLocalCache:(NSString *)scopeKey
                               appID:(NSString *)appID;

/**
 * @brief 授权里面的 ubc 打点
 *
 * @param appID  appID
 * @param errorCodeStr 错误码信息
 * @param extInfo 打点信息
 * @param isNeedVersionTime  是否要带上version 和 updatetime
*/
+ (void)stableMonitorWithAppID:(NSString *)appID
                  errorCodeStr:(NSString *)errorCodeStr
                       extInfo:(NSDictionary *)extInfo
                    isNeedVersionTime:(BOOL)isNeedVersionTime;
@end