本文對iOS第三方登錄流程進行整理總結,以微信為例,附第三方登錄認證原理
首先要到微信開放平臺注冊登錄賬號,并創建移動應用程序。創建完成后會對應該程序生成一個 appid 和 appSecret 。然后申請該程序的微信登錄功能。
1. 下載微信sdk
2. 將sdk引入工程
3. 添加URL scheme
B80582C4-49C8-4981-8FB6-7F82CB559335.png
4. 向微信終端程序注冊第三方應用,并在第三方應用實現從微信返回
注冊appid
5. 請求CODE
在要微信授權登錄的controller中引入"WXApi.h"頭文件,編寫請求code的代碼
#pragma mark 處理微信第三方登錄
-(void)sendAuthRequestViewController:(UIViewController*)viewController
{
//構造SendAuthReq結構體
SendAuthReq* req =[[SendAuthReq alloc ] init ];
req.scope = @"snsapi_userinfo,snsapi_base";
req.state = @"123d324d444";
//第三方向微信終端發送一個SendAuthReq消息結構
//兼容未安裝微信APP的請求
__weak typeof(self) weakSelf = self;
[WXApi sendAuthReq:req viewController:viewController delegate:weakSelf];
}
6通過 code 獲取到accessToken以及openid
-(void)getWXAccessTokenWith:(SendAuthResp*)resp
{
NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",WeiXinAppID,WeiXinAppSecret,resp.code];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *zoneUrl = [NSURL URLWithString:url];
NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSString *access_token = [dic objectForKey:@"access_token"];
NSString *refrshToken = [dic objectForKey:@"refresh_token"];
NSString *openid = [dic objectForKey:@"openid"];
[self getWXUserInfoWithOpenID:openid accessToken:access_token refreshToken:refrshToken];
}
});
});
}
7. 通過accessToken及openid調用API,獲取用戶信息
請求 @"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openID
獲取openID,unionID等
-(void)getWXUserInfoWithOpenID:(NSString*)openID accessToken:(NSString*) accessToken refreshToken:(NSString*)refreshToken
{
NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openID];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *zoneUrl = [NSURL URLWithString:url];
NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
SL_Log(@"userinfo :%@",dic);
if (!dic) { return ; }
SouFunThirdLoginModel *model = [[SouFunThirdLoginModel alloc] init];
model.openID = [NSString stringWithFormat:@"%@",[dic objectForKey:@"openid"]];
model.headImageURL = [dic objectForKey:@"headimgurl"];
model.userName = [dic objectForKey:@"nickname"];
model.nickName = [dic objectForKey:@"nickname"];
NSString *strSex = [NSString stringWithFormat:@"%@",[dic objectForKey:@"sex"]];
model.sex = [strSex isEqualToString:@"1"] ? @"男" : @"女";
model.accessToken = accessToken;
model.refreshToken = refreshToken;
model.unionID = [NSString stringWithFormat:@"%@",[dic objectForKey:@"unionid"]];
model.language = [dic objectForKey:@"language"];
model.province = [dic objectForKey:@"province"];
model.city = [dic objectForKey:@"city"];
model.thirdType = @"weixin";
if ([model.openID isEqualToString:@"(null)"] || [model.openID isEqualToString:@"null"] || model.openID.length<=1) {
return;
}else{
if (self.thirdBlock) {
self.thirdBlock(model);
}
}
}
});
});
}
8. auth 2.0認證
OAuth
允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要分享他們的訪問許可或他們數據的所有內容。
OAuth 2.0是OAuth的下一個版本,但是不兼容1.0
認證授權過程
在認證和授權的過程中涉及的三方包括:
- 服務提供方,用戶使用服務提供方來存儲受保護的資源,如照片,視頻,聯系人列表。
- 用戶,存放在服務提供方的受保護的資源的擁有者。
- 客戶端,要訪問服務提供方資源的第三方應用,通常是網站,如提供照片打印服務的網站。在認證過程之前,客戶端要向服務提供者申請客戶端標識。
使用OAuth進行認證和授權的過程如下所示:
- 用戶想操作存放在服務提供方的資源。
- 用戶登錄客戶端向服務提供方請求一個臨時令牌。
- 服務提供方驗證客戶端的身份后,授予一個臨時令牌。
- 客戶端獲得臨時令牌后,將用戶引導至服務提供方的授權頁面請求用戶授權。在這個過程中將臨時令牌和客戶端的回調連接發送給服務提供方。
- 用戶在服務提供方的網頁上輸入用戶名和密碼,然后授權該客戶端訪問所請求的資源。
- 授權成功后,服務提供方引導用戶返回客戶端的網頁。
- 客戶端根據臨時令牌從服務提供方那里獲取訪問令牌。
- 服務提供方根據臨時令牌和用戶的授權情況授予客戶端訪問令牌。
- 客戶端使用獲取的訪問令牌訪問存放在服務提供方上的受保護的資源。