首页 » ios付费应用 » Apple登录可以看做第三方登录的一种ID以及Key文件下载文件

Apple登录可以看做第三方登录的一种ID以及Key文件下载文件

 

国外苹果ID/美日韩台、新加坡、香港等——点击购买
韩国区已过年龄认证17+ 19+ 的苹果id游戏应用下载
日本区苹果商店_国外苹果ID/美日韩台新加坡等
独享美区ID小火箭账号----点击购买
正版苹果商店礼品卡、软件兑换码——点击购买

苹果登录可以看成是第三方登录的一种,即使用Apple ID登录。前提是你已经有苹果开发者账号,直接进入正题。

添加 App ID

在这里插入图片描述

填写身份证

在这里插入图片描述

选中“使用 Apple 登录”

创建密钥

Apple 将使用公钥/私钥对作为 OAuth 客户端密码,其中客户端密码实际上是已签名的 JWT,下一步是向 Apple 注册一个新的私钥。

在这里插入图片描述

创建完成后会生成Key ID和Key文件。下载的密钥文件实际上是一个.p8 文件。双击打开此文件中所需的密钥。这个文件非常重要,只能下载一次。请妥善保存!!!

在这里插入图片描述

在这里插入图片描述

生成客户端密钥 ( )

Apple 要求您自己从私钥而不是静态客户端密钥派生客户端密钥。他们使用 JWT 标准,使用带有 P-256 曲线和哈希的椭圆曲线算法。换句话说,他们使用算法。某些 JWT 库不支持椭圆曲线方法,因此在开始尝试之前确保您的库支持椭圆曲线。该库支持此算法,因此我们将使用它来生成密钥。

首先,确保安装了 Ruby,然后从命令行运行以下命令来安装 JWT gem:

gem install jwt

根据上面准备的ID、Team ID、Key ID、.p8,可以生成( key)。我们简单的创建一个txt文件,命名更新apple id设置验证失败,然后将后缀改为.rb,即.rb。模板内容如下:

require 'jwt'
key_file = ''
team_id = ''
client_id = ''
key_id = ''
ecdsa_key = OpenSSL::PKey::EC.new IO.read key_file
headers = {
  'kid' => key_id
}
claims = {
	'iss' => team_id,
	'iat' => Time.now.to_i,
	'exp' => Time.now.to_i + 86400*180,
	'aud' => 'https://appleid.apple.com',
	'sub' => client_id,
}
token = JWT.encode claims, ecdsa_key, 'ES256', headers
puts token

该代码使用 ES256 算法生成具有少量声明的 JWT。JWT 将在 6 个月后到期更新apple id设置验证失败,这是 Apple 允许的最大期限。如果您在每次用户身份验证时都生成一个新的客户端机密 JWT,那么您应该使用较短的到期日期,但这允许我们生成一次密钥并在示例应用程序中轻松使用它。

这里我们将使用我们准备好的四个数据,现在你可以从命令行运行它,它会输出一个 JWT:

在这里插入图片描述

ruby xxx/xx/xx/secret_gen.rb

在这里插入图片描述

这个eyJra.....RuAQ就是我们需要的客户端密钥,然后我们验证这个密钥是否有效。

在您的项目中配置 Apple Sign In

先导入头文件#,然后调出苹果授权页面

    if (@available(iOS 13.0, *)) {
        ASAuthorizationAppleIDProvider *appleIdProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        ASAuthorizationAppleIDRequest *authAppleIDRequest = [appleIdProvider createRequest];
        /*
         //慎用 ASAuthorizationPasswordRequest
         //当启用ASAuthorizationPasswordRequest且停止使用Apple ID(真机-设置-账户-密码与安全性-使用您Apple ID的App-App列表-停止使用 Apple ID, 如果KeyChain里面没有登录信息且重新使用苹果授权登录(Sign in with Apple)会报未知错误
         ASAuthorizationPasswordRequest* authPasswordRequest = [[[ASAuthorizationPasswordProvider alloc] init] createRequest];
         
         NSMutableArray <ASAuthorizationRequest*> * array = [NSMutableArray arrayWithCapacity:2];
         if(authAppleIDRequest) [array addObject:authAppleIDRequest];
         if(authPasswordRequest) [array addObject:authPasswordRequest];
         
         NSArray <ASAuthorizationRequest*> * requests = [array copy];
         ASAuthorizationController* authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:requests];
         */
        authAppleIDRequest.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
        
        //由ASAuthorizationAppleIDProvider创建的授权请求 管理授权请求的控制器
        ASAuthorizationController* authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[authAppleIDRequest]];
        //设置授权控制器通知授权请求的成功与失败的代理
        authorizationController.delegate = self;
        //设置提供 展示上下文的代理,在这个上下文中 系统可以展示授权界面给用户
        authorizationController.presentationContextProvider = self;
        //在控制器初始化期间启动授权流
        [authorizationController performRequests];
        
    } 

代理回调,

//授权成功
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0))
{
    NSString *userID = nil;
    NSString *userName = nil;
    NSString *userEmail = nil;
    
    EVAppleLoginCredentialModel *model = [[EVAppleLoginCredentialModel alloc] init];
    
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        
        ASAuthorizationAppleIDCredential *credential = authorization.credential;
        
        //苹果用户唯一标识符,该值在同一个开发者账号下的所有App下是一样的,开发者可以用该唯一标识符与自己后台系统的账号体系绑定起来。
        userID = credential.user;
    
        //苹果用户信息 如果授权过,无法再次获取该信息
        userEmail = credential.email;
        NSPersonNameComponents *fullName = credential.fullName;
        userName = [NSString stringWithFormat:@"%@%@", fullName.familyName, fullName.givenName];
        
        //用于判断当前登录的苹果账号是否是一个真实用户,取值有:unsupported、unknown、likelyReal
        ASUserDetectionStatus realUserStatus = credential.realUserStatus;
        //服务器验证需要使用的参数
        NSString *authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding];
        NSString *identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];
        
        NSLog(@"authorization [ASAuthorizationAppleIDCredential] successfully");
        NSLog(@"authorization userID: %@", userID);
        NSLog(@"authorization userName: %@", userName);
        NSLog(@"authorization userEmail: %@", userEmail);
        NSLog(@"authorization realUserStatus: %@", @(realUserStatus));
        NSLog(@"authorization authorizationCode: %@", authorizationCode);
        NSLog(@"authorization identityToken: %@", identityToken);
        
    } else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
        //用户登录使用现有的密码凭证
        ASPasswordCredential *passwordCredential = authorization.credential;
        //密码凭证对象的用户标识 用户的唯一标识和密码
        userID = passwordCredential.user;
        NSString *password = passwordCredential.password;
    
        NSLog(@"authorization [ASPasswordCredential] successfully");
        NSLog(@"authorization userID: %@", userID);
        NSLog(@"authorization password: %@", password);
        
        model.user = passwordCredential.user;
        
        userName = @"";
        userEmail = @"";
        
    } else {
        assert(0);
    }
    
    //数据校验通过后,将这些数据发送给服务器进行验证,等待服务器的回应
    //如果用户选择隐藏邮箱的,email获取不到,其他数据正常,服务端匹配标准userID
    if (![ZJUtils isEmpty:userID]) {
        //在授权成功的回调中拿到服务器所需要的参数传给后台
        //至此我们所需要做的已经完成了,看后台的验证就行了
        if (self.appleLoginBlock) {
            self.appleLoginBlock(0, @"苹果授权成功", model);
        }
        
    } else {
        //授权数据异常
        if (self.appleLoginBlock) {
            self.appleLoginBlock(-1, @"苹果授权失败", nil);
        }
    }
}
//授权失败
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0))
{
    NSString *errorMsg = nil;
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    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);
}
#pragma mark ASAuthorizationControllerPresentationContextProviding
- (ASPresentationAnchor) presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller API_AVAILABLE(ios(13.0))
{
    return self.view.window;
}

在 - (void)ler:(oller *) :( *) 回调中,我们获取参数作为验证。

打开我们的测试:

https://appleid.apple.com/auth/token?client_id=xxx&client_secret=xxx&code=xxx&grant_type=authorization_code&redirect_uri=https://appleid.apple.com

在这里插入图片描述

至此,基本完成。其实苹果登录的大部分工作都是在后台完成的,包括生成等,我们客户端只需要拿到苹果授权的数据给后台,后台会做校验。

参考:

国外苹果ID/美日韩台、新加坡、香港等——点击购买
韩国区已过年龄认证17+ 19+ 的苹果id游戏应用下载
日本区苹果商店_国外苹果ID/美日韩台新加坡等
独享美区ID小火箭账号----点击购买
正版苹果商店礼品卡、软件兑换码——点击购买

原文链接:Apple登录可以看做第三方登录的一种ID以及Key文件下载文件,转载请注明来源!

0