iOS Apple第三方登录

Sign In with Apple是iOS 13的新增功能,跨平台的,支持iOS、macOS、watchOS、tvOS、JS。需要用: MacOS 10.14.4及以上的系统的和Xcode 11及以上开发,所有已接入其它第三方登录的 App,必须支持Apple登录,否则审核将会被拒绝。(可能有人要问了iOS13之前怎么办?放个Apple图标,点击时给个提示即可)

授权流程图

准备工作

  1. 登录开发者账号,Bundle ID 勾选 Sign In With Apple ,开启登录功能(勾选或取消服务,会导致之前的 profile 描述文件失效,不需要新建,只要点击 Edit 重新编辑对应的 profile文件,然后保存下载使用新的profile文件即可)


    开通登录功能
  2. 在Xcode Signing & Capabilities中添加Sign In With Apple


    Xcode配置该功能

代码集成

  1. 导入头文件
// OC
 #import <AuthenticationServices/AuthenticationServices.h>
// Swift 
import AuthenticationServices
  1. 添加代理
ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding
  1. 设置UI按钮(可以用系统提供的,也可以用自定义样式),只讲系统按钮的样式,自行百度


    White,白色样式

    WhiteOutline,带边框样式

    Black,黑色样式
  2. 点击按钮的响应方法

 if (@available(iOS 13.0, *)) {
     ASAuthorizationAppleIDProvider *provider = [[ASAuthorizationAppleIDProvider alloc] init];
     ASAuthorizationAppleIDRequest *request = [provider createRequest];
     request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
     ASAuthorizationController *vc = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
     vc.delegate = self;
     vc.presentationContextProvider = self;
     [vc performRequests];
 }
  1. 代理回调方法
#pragma mark - ASAuthorizationControllerDelegate

- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)) {
    NSString *errorMsg = nil;
    switch (error.code) {
        case ASAuthorizationErrorCanceled:
            errorMsg = @"用户取消了授权请求";
            break;
        case ASAuthorizationErrorFailed:
            errorMsg = @"授权请求失败";
            break;
        case ASAuthorizationErrorInvalidResponse:
            errorMsg = @"授权请求响应无效";
            break;
        case ASAuthorizationErrorNotHandled:
            errorMsg = @"未能处理授权请求";
            break;
        case ASAuthorizationErrorUnknown:
            errorMsg = @"授权请求失败未知原因";
            break;
    }
    NSLog(@"%@", errorMsg);
}

- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
    
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        ASAuthorizationAppleIDCredential *credential = (ASAuthorizationAppleIDCredential *)authorization.credential;
        NSString *state = credential.state;
        NSString *userID = credential.user;
        NSPersonNameComponents *fullName = credential.fullName;
        NSString *email = credential.email;
       // 服务器验证需要使用的参数
        NSString *authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding];
        NSString *identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];
        ASUserDetectionStatus realUserStatus = credential.realUserStatus;
        NSArray *authorizedScopes = credential.authorizedScopes;
        
        NSLog(@"state: %@", state);
        NSLog(@"userID: %@", userID);
        NSLog(@"fullName: %@", fullName);
        NSLog(@"email: %@", email);
        NSLog(@"authorizationCode: %@", authorizationCode);
        NSLog(@"identityToken: %@", identityToken);
        NSLog(@"realUserStatus: %@", @(realUserStatus));
        NSLog(@"authorizedScopes: %@", authorizedScopes);
    }
}

#pragma mark - ASAuthorizationControllerPresentationContextProviding
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller API_AVAILABLE(ios(13.0)) {
    return [UIApplication sharedApplication].keyWindow;
}
- (NSString *)documentPath{
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    return documentPath;
}

苹果登录返回信息
识别用户
identityToken:JSON Web令牌(JWT),可将有关用户的信息安全地传递到您的应用程序。
authorizationCode:与应用程序的服务器副本交互时,应用程序使用的短暂令牌来作为授权证明。
state:您的应用程序提供给生成凭据的请求的任意字符串。
user:与已认证用户关联的标识符。(苹果用户唯一标识符)
获取用户信息
authorizedScopes:用户授权您的应用访问的联系信息。
fullName:名称对象
email:用户邮箱地址(真实或者隐藏)
检测用户特征
realUserStatus:指示用户是否看起来是真实人物的值。
ASUserDetectionStatus:实际用户指标的可能值

一、共享我的邮箱
state: (null)
userID: 001324.bd4cdc4453964f23859a106528dc7b00.0257
fullName: <NSPersonNameComponents: 0x60000046dc10> {givenName = 名, familyName = 姓, middleName = (null), namePrefix = (null), nameSuffix = (null), nickname = (null) phoneticRepresentation = (null) }
email: 000000@qq.com
authorizationCode: c7539fdca92bb4b78b4b8e54a128b34d9.0.nrtsu.fOYwoxw-PWeSfXyWnXseCg
identityToken: eyJraWQiOiJBSURPUEsxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLmd1bGkuemVuYm9ybiIsImV4cCI6MTU3MzAwOTg5OCwiaWF0IjoxNTczMDA5Mjk4LCJzdWIiOiIwMDEzMjQuYmQ0Y2RjNDQ1Mzk2NGYyMzg1OWExMDY1MjhkYzdiMDAuMDI1NyIsImNfaGFzaCI6ImF5aWhyR0RaNndRZkdra3NFM3hhOGciLCJlbWFpbCI6IjE1OTU1NDYyMTRAcXEuY29tIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiYXV0aF90aW1lIjoxNTczMDA5Mjk4fQ.DS41gpURwyowq9bXCmYni_p6KQq7NmBn_uLKA_Kymz8AS3V4rxcgKk8NoVuqPIIbW-GkUQjhzF1tWICNhqTnAoJgSIuDxDYO0xubPg4jwgr1ZgqtDUix-l6evBfuR-7DSbL2E3Rl7T1VFxX-MWL_nJDcfuh3wlOUbTE_RfbgPMwv4V4HPTskFa9kWS9-NMUvs9PUGiAkMSUx6AnqCZ65nbLqq13h0pMSaX8NFgUvZrLyonbgDU8cMkVwz_X3CMQGF1UHSkRiMlCeoYU0Z-2w6RGAhMPHCGZZWx48aefO8obn_NugfXbtWFsKBKTaJ09M0CBQP6679_NRb2n-0mXEXw
realUserStatus: 1


二、隐藏我的邮箱
state: (null)
userID: 001324.bd4cdc4453964f23859a106528dc7b00.0257
fullName: <NSPersonNameComponents: 0x600000465cd0> {givenName = Lau, familyName = Winson, middleName = (null), namePrefix = (null), nameSuffix = (null), nickname = (null) phoneticRepresentation = (null) }
email: 6ydppeishc@privaterelay.appleid.com
authorizationCode: cb7a915f207d9462886eea8711c87cb96.0.nrtsu.JHIFsv-gkeb3MkEdRQwmNA
identityToken: eyJraWQiOiJBSURPUEsxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLmd1bGkuemVuYm9ybiIsImV4cCI6MTU3MzAxMDMxOCwiaWF0IjoxNTczMDA5NzE4LCJzdWIiOiIwMDEzMjQuYmQ0Y2RjNDQ1Mzk2NGYyMzg1OWExMDY1MjhkYzdiMDAuMDI1NyIsImNfaGFzaCI6IjdQYkF5N3VVMk5XS2VoNFVzV3lfQkEiLCJlbWFpbCI6IjZ5ZHBwZWlzaGNAcHJpdmF0ZXJlbGF5LmFwcGxlaWQuY29tIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiaXNfcHJpdmF0ZV9lbWFpbCI6InRydWUiLCJhdXRoX3RpbWUiOjE1NzMwMDk3MTh9.J67iq7rjgqJZBxkryzGcZnIK2-Zsyab85QrhlhPDjfY2N9cZN0zlNWkiNlZB6oDbGYOU9Gjh20phh3SSBrHNfixNpRD-kypSqPPu9E84qdnUjX6EypKX27vx0a2fM11jByEV05A_KU7fKaKz0F5TZZ40wk6MibaKHuj4e5r2mQOA7Bgkr_uiygeigqWYACE0wo1Did2rOY40M6mWYOYvg0ALWifzXe1c0V_rKHQFpfLpgX1lty4GnsWtyglLESCNeIoWhRnhxK_5BESGKrSUbzIROTx3kd9dGT1OWcAu2HyyU-xsELPS1iPqdZix18CzY-4QwkB7Uhyo6jbBP9mlpA
realUserStatus: 1

参考资料
如何通过 ASWebAuthenticationSession 获取身份验证 code 码

  1. https://developer.apple.com/documentation/authenticationservices/implementing_user_authentication_with_sign_in_with_apple

  2. https://www.cnblogs.com/wangkejia/p/13398475.html

  3. http://www.cocoachina.com/articles/28111

  4. https://www.jianshu.com/p/6366a15947d4

  5. https://juejin.cn/post/6844903914051993607

  6. https://juejin.cn/post/6940903500754714655

  7. https://juejin.cn/post/6844904050232655885

  8. https://juejin.cn/post/6844904110613856264

  9. https://juejin.cn/post/6844903894800138247

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容