使用playPORTAL进行身份验证

在本文中,我们将使用playPORTAL Swift SDK创建一个简单的iOS应用并集成playPORTAL的身份验证流程。 我们将展示您可以轻松使用playPORTAL的单点登录(SSO)将playPORTAL用户认证到您的iOS应用中,并可以访问playPORTAL的COPPA兼容社交网络。

首先,前往playPORTAL并创建您的playPORTAL开发者帐户以及一个新应用。 创建应用程序后,您将能够获取该应用程序的客户端ID和密码,这是您的应用程序发出播放PORTAL API所必需的。
您还需要为您的应用添加身份验证配置文件范围。 范围决定了您的应用有权访问哪些信息; 在本文中,我们仅关注对用户进行身份验证并请求其个人资料。 现在,让我们打开Xcode,创建一个新项目,然后选择“ Single View App”。

首先,我们需要添加PPSDK-Swift作为外部依赖关系,我们将使用Cocoapods进行添加。 如果尚未安装,请使用以下命令全局安装Cocoapods:


须藤宝石安装cocoapods

然后,在项目的根目录中,通过运行添加Cocoapod支持


荚初始化
吊舱更新

这将在我们从现在开始使用的目录中创建一个.xcworkspace文件。 关闭当前的Xcode会话并打开此文件。
要添加SDK,请在项目导航器中的Pods目录下打开Podfile ,然后添加


pod“ PPSDK-Swift”,:git =>“ https://github.com/playportal-studio/PPSDK-Swift.git”,:tag =>“ 0.2.0”

use_frameworks

最后,要安装SDK,请在终端中返回您的项目并运行


吊舱安装

组态

现在已经创建了项目,并且我们添加了PPSDK-Swift Pod,让我们将其配置为使用您在playPORTAL studio中创建的应用程序。 在您的项目中,创建一个名为Config.swift的文件。 转到您的帐户,获取创建的客户端ID和密码以及与应用程序关联的重定向URI。 我们将这些值以及环境添加到Config.swift中。 它应该看起来像这样的配置

注意 :重要的是,将配置变量设为私有,并且不要将其添加到版本控制中。 如果使用git,则应在项目的根目录(而不是Xcode)中创建一个.gitignore文件,并将Config.swift添加到其中。 这样,您的配置文件不会添加到提交历史记录中,也不会被推送到远程存储库中。
您还需要在Xcode中注册应用的重定向URI。 这样,用户通过SSO登录后,SSO便能够重定向回应用程序。 在项目导航器中单击您的根项目文件夹,然后转到“ 信息”选项卡。 底部的“ URL类型”部分是您将添加重定向URI的位置。
这是一个URL类型示例。 大! 不用进行配置,让我们编写一些代码!

playPORTAL为您提供了一个现成的社交网络,因此您可以专注于应用程序的业务逻辑,而不必担心自己创建用户身份验证系统。 用户通过遵循OAuth2模型的playPORTAL SSO流进行身份验证。 只需几行代码,用户就可以登录并使用您的应用程序!
转到项目中的AppDelegate.swift文件。 您可以删除application(_:didFinishLaunchingWithOptions 🙂之外的所有方法,因为它们将不再需要。 在这种方法中,我们将使用我们的配置变量来配置SDK。 这使SDK可以代表应用程序发出请求,以及注册其重定向URI。


PlayPortalAuth.shared.configure(forEnvironment:env,withClientId:clientId,andClientSecret:clientSecret,andRedirectURI:redirect)

(不要忘记在文件顶部添加导入PPSDK_Swift !)。
现在,我们将让SDK检查是否有当前经过身份验证的用户。 使用我们的SDK,用户可以保持登录状态,除非他们自己注销。 因此,如果用户已经通过身份验证,则可以立即转到应用程序的初始视图控制器。 否则,您将必须打开登录视图控制器,以便用户可以通过SSO登录。 让我们在configure方法下添加它:


PlayPortalAuth.shared.isAuthenticated(loginDelegate:self){错误,用户配置文件位于

}

请注意,此方法采用类型为PlayPortalLoginDelegate的参数loginDelegate 。 这是SDK提供的协议,允许一致的类接收与身份验证流有关的消息,例如登录失败或注销成功。 您可以简单地让您的AppDelegate类符合它,而无需立即执行任何方法,因为它们都是可选的。

isAuthenticated还使用闭包作为参数,该闭包采用两个参数: erroruserProfileuserProfilePlayPortalProfile的实例,代表用户的playPORTAL配置文件。 如果成功完成身份验证,将使用userProfile调用完成功能;如果在登录流程中发生某些问题,则将发生错误 。 如果两个参数均为nil,则用户未通过身份验证,因此需要登录。 现在,让我们添加一些代码以在用户未通过身份验证时进行处理:



如果让错误=错误{
打印(“身份验证期间发生错误:\(错误)”)
} if userProfile == nil {
保护让登录= UIStoryboard.init(名称:“主要”,捆绑:无)。instantiateViewController(withIdentifier:“登录”)为? LoginViewController else {
返回
}
self.window?.rootViewController =登录
}

我们还需要在AppDelegate中实现另一种方法:

func application(_ app:UIApplication,打开url:URL,选项:[UIApplication.OpenURLOptionsKey:Any] = [:])-> Bool {
PlayPortalAuth.shared.open(URL:URL)
返回真
}

当SSO流成功完成并调用应用程序的重定向URI时,将调用此方法。 使用`url`参数调用`PlayPortalAuth.shared.open(url:url)`,它将提取在SSO过程中创建的授权令牌。
此时,您应该会得到一个错误。 为什么? 好吧,因为LoginViewController不存在! 让我们添加一个新的LoginViewController.swift文件并创建一个简单的LoginViewController类。 然后,在Main.storyboard文件中,添加一个新的视图控制器,并将其与刚创建的LoginViewController类相关联。 不要忘记将视图控制器的Storyboard ID设置login 。 我们还将在情节提要中的登录视图控制器中添加一个UIView ,它将在其包含视图中水平和垂直居中,并且宽度和高度与其包含视图相同。 将刚才创建的视图连接到LoginViewController类。

我们将要添加到LoginViewController的另一段代码:


让loginButton = PlayPortalLoginButton(来自:self)
loginButton.center = CGPoint(x:view.bounds.size.width / 2,y:view.bounds.size.height / 2)
loginView.addSubview(loginButton)

此代码段在我们连接到LoginViewController的 UIView的中心添加了一个PlayPortalLoginButtonPlayPortalLoginButtonUIButton的子类,点击该按钮将启动playPORTAL SSO流。
此时,我们的Main.storyboard文件和LoginViewController.swift文件应如下所示:storyboard

在进行其他操作之前,让我们创建一个playPORTAL用户以身份登录。
在开发过程中,不必手动创建测试用户是很方便的。 playPORTAL的沙盒环境使您可以做到这一点。 前往playPORTAL工作室中的[https://studio.playportal.io/studio/sandbox](https://studio.playportal.io/studio/sandbox); 在这里,您可以生成代表实际playPORTAL用户外观的沙盒用户。 生成一个您将用来登录的新用户。

最后,让我们运行该应用程序!
当应用启动时,它将以中间的PlayPortalLoginButton打开对我们的LoginViewController

如果单击它,将带您进入playPORTAL SSO屏幕,您可以在其中以刚刚创建的沙箱用户身份登录。

如果一切顺利,则用户应该已成功通过身份验证。

如果单击继续 ,将返回到我们的登录页面。 现在,我们需要处理用户经过身份验证的情况。

让我们转到AppDelegate.swift并重构传递给PlayPortalAuth.shared.isAuthenticated的完成。 当用户成功验证身份后,我们将打开ProfileViewController并将其传递给我们收到的userProfile实例。



如果让userProfile = userProfile {
保护让profile = UIStoryboard.init(name:“ Main”,bundle:nil).instantiateViewController(withIdentifier:“ profile”)为? ProfileViewController else {
返回
}
profile.userProfile = userProfile
self.window?.rootViewController =配置文件
} if let error = error {
打印(“身份验证期间发生错误:\(错误)”)
} if userProfile == nil {
保护让登录= UIStoryboard.init(名称:“主要”,捆绑:无)。instantiateViewController(withIdentifier:“登录”)为? LoginViewController else {
返回
}
self.window?.rootViewController =登录
}

让我们添加一个新的ProfileViewController.swift文件, 其中声明一个ProfileViewController 。 我们还将在Main.storyboard中添加一个新的视图控制器,并将其连接到ProfileViewStoryboard IDProfileViewController 我们还添加一个标签,让我们知道我们已成功登录。 这里的情节提要示例

如果我们再次执行SSO流程,则应转到个人资料页面。
现在,该概要文件实际上并不是概要文件,因此为什么我们不利用在userProfile中返回的一些属性。 您可以创建自己的配置文件UI或在存储库中检出完成的ProfileViewController (最后链接)。

嘿,看那个! 它开始看起来像一个真实的个人资料页面。 当然,我不希望您创建一个自己复杂的UI,但是您知道了。 让我们快速看一下在ProfileViewController中添加的代码以执行此操作:


handleLabel.text = userProfile.handle
coverPhotoImageView.playPortalCoverPhoto(forImageId:userProfile.coverPhoto,nil)
profilePicImageView.playPortalProfilePic(forImageId:userProfile.profilePic,nil)

PPSDK-Swift在UIImageView上添加了一些辅助方法作为扩展,以将用户的个人资料图片或封面照片添加为图像视图的基础UIImage 。 用户可能没有个人资料照片或封面照片,因此PlayPortalProfileprofilePiccoverPhoto属性均为String类型 。 两种方法中的forImageId参数都采用String参数吗? ; 如果传入nil ,则将提供默认图像。

让我们通过添加对注销的支持来关闭身份验证循环。
在我们的Main.storyboard文件中,我们会将个人资料视图控制器嵌入到Navigation Controller中。 我们将添加一个“ Bar Button Item”作为配置文件控制器的“ Right Bar Button Item”。 将标题设置为“注销”,并将其作为“ IBAction”连接到您的“ ProfileViewController”类。 我们的** Main.storyboard **文件和** ProfileViewController.swift **文件应如下所示:轻按LogoutTapped(_ :)方法中的注销,我们将添加


PlayPortalAuth.shared.logout()

我们还需要重构AppDelegate中传递给isAuthenticated的完成。 验证用户身份后,我们希望将rootViewController设置为我们刚刚创建的导航控制器:


卫队让导航= UIStoryboard.init(名称:“主要”,捆绑:无)。instantiateViewController(withIdentifier:“导航”)为? UINavigationController
,让profile = navigation.viewControllers [0]设为? ProfileViewController
其他{
返回
}
profile.userProfile = userProfile
self.window?.rootViewController =导航

确保还要在Main.storyboard文件中为导航控制器提供导航的Storyboard ID 。 回想一下,我们向AppDelegate添加了PlayPortalLoginDelegate一致性。 该协议声明了一些在SSO流阶段(包括注销)调用的方法。 在您的AppDelegate中 ,添加:


func didLogoutSuccessfully(){
}

成功注销后,SDK将调用此方法。 在大多数情况下,您可能会在用户注销后返回到LoginViewController 。 让我们通过将对isAuthenticated的调用放在自己的方法中来重构AppDelegate


func authenticate(){
PlayPortalAuth.shared.isAuthenticated(loginDelegate:self){错误,用户配置文件位于
如果让userProfile = userProfile {
卫队让导航= UIStoryboard.init(名称:“主要”,捆绑:无)。instantiateViewController(withIdentifier:“导航”)为? UINavigationController
,让profile = navigation.viewControllers [0]设为? ProfileViewController
其他{
返回
}
profile.userProfile = userProfile
self.window?.rootViewController =导航
} if let error = error {
打印(“身份验证期间发生错误:\(错误)”)
} if userProfile == nil {
保护让登录= UIStoryboard.init(名称:“主要”,捆绑:无)。instantiateViewController(withIdentifier:“登录”)为? LoginViewController else {
返回
}
self.window?.rootViewController =登录
}
}
}

现在,我们可以在PlayPortalAuth.shared.configure之后调用此方法,并在我们的didLogoutSuccessfully方法中调用它。
当用户注销时,SDK将调用didLogoutSuccessfully方法,该方法将调用我们的authenticate方法。 由于不再对用户进行身份验证,因此他们将被重定向回登录页面。 运行该应用并尝试一下!

在本文中,我们看到仅需几行代码,便能够将playPORTAL身份验证添加到iOS应用程序,从而使我们能够访问整个playPORTAL社交网络。 使用playPORTAL沙盒环境,我们能够在开发过程中创建测试用户,而无需我们自己手动创建测试用户。 在以后的文章中,我们将讨论如何添加功能,例如playPORTAL的排行榜闪电数据库功能。 敬请关注! 您可以在这里找到完成的项目。