用户账号

更新时间:2020-03-06 17:07:08

用户账号主要包含身份认证SDK用户账号SDK

身份认证 SDK

概述

提供基于 iotToken 的用户身份认证方案,通过和账号及用户SDK、API通道SDK的集成,完成用户身份凭证的生成和管理,以及发起API请求的用户身份的鉴权

依赖SDK 概述
日志 基础依赖SDK,提供客户端统一日志打印,日志等级控制,分模块日志隔离等能力
API 通道 提供API通道能力,和基础环境配置信息

初始化

参考平台下载包里的说明文件。

使用说明

发送带身份认证的 API 请求

下述代码片断描述了如何发送一个带身份认证的请求

// 引入头文件
#import <IMSAuthentication/IMSIoTAuthentication.h>
#import <IMSApiClient/IMSApiClient.h>
// 构建请求
NSString *path = @"/uc/listByAccount";
NSString *apiVer = @"1.0.0";
NSDictionary *params = @{};
IMSIoTRequestBuilder *builder = [[IMSIoTRequestBuilder alloc] initWithPath:path apiVersion:apiVer params:params];
// 指定身份认证类型
[builder setAuthenticationType:IMSAuthenticationTypeIoT];
//通过 IMSRequestClient 发送请求
[IMSRequestClient asyncSendRequest:builder.build responseHandler:^(NSError * _Nullable error, IMSResponse * _Nullable response) {
    if (error) {
        //处理Error,非服务端返回的错误都通过该Error回调
    } else {
        if (response.code == 200) {
            //成功,处理response.data
        }
        else {
            //处理服务端错误
        }
    }
}];

API 请求的认证错误处理

目前服务端逻辑不支持同一个账号多端登录,如果一个账号在多个设备登录,那么只有最后一个登录的账号才可以正常访问IoT服务,其他账号在发送 API 通道请求的时候则会返回认证错误(错误码为 401)。 还有一些情况,如,账号未登录或登录信息过期(长时间未登陆)的时候,也会在发送 API 通道请求的时候则会返回认证错误。

通常情况下只需要处理 API 请求的错误即可

[IMSRequestClient asyncSendRequest:builder.build responseHandler:^(NSError * _Nullable error, IMSResponse * _Nullable response) {
    if (error) {
        //...
    } else {
        if (response.code == 200) {
            //...
        }
        else if (response.code == 401) {
            //处理认证错误
        }
        else {
            //...
        }
    }
}];

如果希望有个统一的地方可以处理这种类型的认证错误,请参考如下步骤

继承IMSIoTAuthentication来实现自定义的身份认证功能

@interface XXCustomAuthentication : IMSIoTAuthentication
@end
@implementation XXCustomAuthentication

- (void)handleRequestBeforeSend:(IMSRequest * _Nonnull)request
                        payload:(IMSRequestPayload * _Nonnull)payload
                     completion:(void (^ _Nonnull)(NSError * _Nullable error,
                                                   IMSResponse *_Nullable mockResponse,
                                                   IMSRequestPayload * _Nullable newPayload))completionHandler {
    [super handleRequestBeforeSend:request payload:payload completion:^(NSError * _Nullable error, IMSResponse * _Nullable mockResponse, IMSRequestPayload * _Nullable newPayload) {
        completionHandler(error, mockResponse, newPayload);

        if (mockResponse && mockResponse.code == 401) {
            //自定义处理 401, 比如 toast
            NSLog(@"before: 401");
        }
    }];
}

- (void)handleResponse:(IMSResponse * _Nonnull)response
            completion:(void (^ _Nonnull)(NSError * _Nullable error, IMSResponse * _Nullable response))completionHandler {
    [super handleResponse:response
               completion:^(NSError * _Nullable error, IMSResponse * _Nullable response) {
                   completionHandler(error, response);

                   if (response && response.code == 401) {
                       //自定义处理 401, 比如 toast
                       NSLog(@"after: 401");
                   }
               }];
}
@end

注释掉身份认证的如下初始化代码

//[IMSCredentialManager initWithAccountProtocol:accountService.sessionProvider];
//IMSIoTAuthentication *iotAuthDelegate = [[IMSIoTAuthentication alloc] initWithCredentialManager:IMSCredentialManager.sharedManager];
//[IMSRequestClient registerDelegate:iotAuthDelegate forAuthenticationType:IMSAuthenticationTypeIoT];

修改成自定义的身份认证, 即可完成统一的处理

[IMSCredentialManager initWithAccountProtocol:accountService.sessionProvider];
XXCustomAuthentication *iotAuthDelegate = [[XXCustomAuthentication alloc] initWithCredentialManager:IMSCredentialManager.sharedManager];
[IMSRequestClient registerDelegate:iotAuthDelegate forAuthenticationType:IMSAuthenticationTypeIoT];

获取用户身份凭证

在账号登录成功后,可通过下面的方法同步获取用户身份凭证信息

#import <IMSAuthentication/IMSCredentialManager.h>
IMSCredential *credential = [IMSCredentialManager sharedManager].credential;
NSString *identityId = credential.identityId;
NSString *iotToken = credential.iotToken;

刷新用户身份凭证

当同步方法获取到的用户身份凭证为空时,可以通过下面的方法强制异步刷新一个新的用户身份凭证信息

#import <IMSAuthentication/IMSCredentialManager.h>
[[IMSCredentialManager sharedManager] asyncRefreshCredential:^(NSError * _Nullable error, IMSCredential * _Nullable credential) {
    if (error) {
        //刷新出错,参考错误码 IMSCredentialManagerErrorCode 处理
    } else {
        NSString *identityId = credential.identityId;
        NSString *iotToken = credential.iotToken;
    }
}];

用户账号SDK

概述

提供自建账号体系能力,包括注册,登录,登出,获取账号,会话管理,人机校验,登录UI定制等功能。同时基于Oauth2.0协议,提供快速对接自有账号的能力,满足开发者在App开发中对接自有账号体系的需求。

初始化

参考平台下载包里的说明文件。

内置账号

使用说明

登录

// 引入头文件
#import <ALBBOpenAccountCloud/ALBBOpenAccountSDK.h>
#import <ALBBOpenAccountCloud/ALBBOpenAccountUser.h>
// 获取账号UI服务
id<ALBBOpenAccountUIService> uiService = ALBBService(ALBBOpenAccountUIService);
// 显示登录窗口
[uiService presentLoginViewController:controller success:^(ALBBOpenAccountSession *currentSession) {
  // 登录成功,currentSession为当前会话信息
  // 获取当前会话标识
  NSLog(@"sessionId:%@", currentSession.sessionID);
  // 获取当前用户信息
  ALBBOpenAccountUser *currentUser = [currentSession getUser];
  NSLog(@"mobile:%@", [currentUser mobile]);
  NSLog(@"avatarUrl:%@", [currentUser avatarUrl]);
  NSLog(@"accountId:%@", [currentUser accountId]);
  NSLog(@"displayName:%@", [currentUser displayName]);
} failure:^(NSError *error) {
  // 登录失败对应的错误;取消登录同样会返回一个错误码
}];

退出登录

// 引入头文件
#import <ALBBOpenAccountCloud/ALBBOpenAccountSDK.h>
// 退出登录
[[ALBBOpenAccountSession sharedInstance] logout];

刷新会话

// 引入头文件
#import <ALBBOpenAccountCloud/ALBBOpenAccountSDK.h>
// 获取当前会话
ALBBOpenAccountSession *session = [ALBBOpenAccountSession sharedInstance];
// 刷新当前会话
[session refreshSessionIDWithCallback:^(NSString *sid, NSError *err) {
  // 如果失败则返回error, 否则返回新的会话Id:sid
}];

获取会话 ID

// 引入头文件
#import <ALBBOpenAccountCloud/ALBBOpenAccountSDK.h>
ALBBOpenAccountSession *session = [ALBBOpenAccountSession sharedInstance];
NSString *sessionID = session.sessionID;

获取用户信息

// 引入头文件
#import <ALBBOpenAccountCloud/ALBBOpenAccountSDK.h>
// 获取当前会话
ALBBOpenAccountSession *session = [ALBBOpenAccountSession sharedInstance];
if ([session isLogin]) {
    // 获取用户信息
    ALBBOpenAccountUser *user = session.getUser;
}

自定义UI

请参考 UI界面自定义 一文

三方自有账号接入

注意在对接三方自有账号时,必须首先完成SDK的初始化。

引入依赖的头文件

#import <ALBBOpenAccountSSO/ALBBOpenAccountSSOSDK.h>
#import <IMSAccount/IMSAccountService.h>

实现自有账号自定义登录,获取 Oauth2.0 的 AuthCode,并调用 ALBBOpenAccountSSOService 进行 Oauth 授权登录。

如何实现 asyncLoginGetAuthCode:,请参见:自有账号登录流程说明

@implementation IMSAccountThirdViewController

- (void)asyncLoginGetAuthCode:(void (^)(NSError * _Nullable error, NSString * _Nullable authCode))completionHandler {
    //自有账号登录并通过 OAuth2.0 服务获取 AuthCode
}

- (IBAction)onClickLogin:(id)sender {
    [self asyncLoginGetAuthCode:^(NSError * _Nullable error, NSString * _Nullable authCode) {
        if (error) {
            // 错误处理
            return;
        } else {
            id<ALBBOpenAccountSSOService> ssoService = ALBBService(ALBBOpenAccountSSOService);
            [ssoService oauthWithThirdParty:authCode delegate:self];
        }
    }];
}
@end

实现 Oauth 授权登录回调

@interface IMSAccountThirdViewController () <SSODelegate>
@end
@implementation IMSAccountThirdViewController

- (void)openAccountOAuthError:(NSError *)error Session:(ALBBOpenAccountSession *)session {
    if (!error) {
        //登录成功,发送登录成功通知,身份认证 SDK 会监听该通知进行用户身份凭证创建和管理
        NSString *loginNotificationName = [[IMSAccountService sharedService].sessionProvider accountDidLoginSuccessNotificationName];
        [[NSNotificationCenter defaultCenter] postNotificationName:loginNotificationName object:nil];
    } else {
        //处理登录失败
    }
}
@end

results matching ""

    No results matching ""