iOSauthentication

我开始在Swift上开发iOS应用程序。 现在我正在创build一个login系统。 但是我们需要来自人们的LinkedIn信息。

如何在iOS中使用OAuth2 API来实现这一目标?

我已经在LinkedIn开发者区域创build了一个应用程序,但是现在我被卡住了。 我得到了一些人的build议,我需要使用UIWebView但我不知道这是如何工作的。

将LinkedInlogin整合到Swift应用程序中

首先,下载LinkedIn iOS SDK 。 我将在这个例子中使用1.07稳定版本。 我将在这里遵循集成指南。

  1. 创build一个新的开发人员申请
  2. 将您的iOS应用的捆绑标识符添加到您的LinkedIn应用下的移动。
  3. 将您的LinkedIn应用程序ID和URL Scheme添加到您应用程序的Info.plist文件中。
  4. 将指定的LinkedIn URLscheme和ATS URL列入白名单。
  5. linkedin-sdk.framework库复制到您的应用程序。 确保select“如果需要复制文件”和“创build文件夹引用组”。

项目设置完成,现在让我们写一些代码!

创build一个名为BridgingHeader.h的新Header文件。 在Tar​​get – > YourApp – > Build Settings – > Swift Compiler – Code Generation下,将MyApp/BridgingHeader.h添加到“Objective-C桥接头”。

在你的BridgingHeader.h ,添加这两行:

 #import <Foundation/Foundation.h> #import <linkedin-sdk/LISDK.h> 

在您的AppDelegate.swift中,添加以下代码来处理OAuth URLcallback:

Swift 3:

 func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { if LISDKCallbackHandler.shouldHandle(url) { return LISDKCallbackHandler.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) } return true } 

Swift 2.x:

 func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { if LISDKCallbackHandler.shouldHandleUrl(url) { return LISDKCallbackHandler.application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) } return true } 

现在是login用户的时候了。 在你的视图控制器中,假设你有一个“login”button。 你的IBAction可能是这样的:

 @IBAction func doLogin(sender: AnyObject) { LISDKSessionManager.createSessionWithAuth([LISDK_BASIC_PROFILE_PERMISSION], state: nil, showGoToAppStoreDialog: true, successBlock: { (returnState) -> Void in print("success called!") let session = LISDKSessionManager.sharedInstance().session }) { (error) -> Void in print("Error: \(error)") } } 

login时,用户将被要求对您的应用程序进行身份validation:

LinkedIn

如果用户允许,则会调用成功块,并且可以获取有关已authentication用户的信息。 如果login失败或用户不允许访问,则会调用失败块,并且可以提醒用户发生的问题。

要获得有关我们validation的用户的信息,请在用户个人资料上调用GET请求:

 let url = "https://api.linkedin.com/v1/people/~" if LISDKSessionManager.hasValidSession() { LISDKAPIHelper.sharedInstance().getRequest(url, success: { (response) -> Void in print(response) }, error: { (error) -> Void in print(error) }) } 

response.data将包含有关经过身份validation的用户的信息:

 "{\n \"firstName\": \"Josh\",\n \"headline\": \"Senior Mobile Engineer at A+E Networks\",\n ... }" 

进一步阅读文档 ,了解更多关于API的更多信息。

一个示例项目(与我的应用程序ID混淆)可以在这里find。

LinkedIn是一个有趣的野兽,因为他们的移动SDK有两个缺陷:

  • 最终用户需要安装LinkedIn应用程序,否则“login”button会将用户redirect到App Store。
  • 移动访问令牌不能在服务器上使用。 从LinkedIn的iOS文档中查看此截图

所以,尽pipeJAL的答案已经足够,但您可能需要考虑在您的移动应用程序中实现LinkedIn的authorization_code OAuthstream程,而不是LinkedIn SDK。 这看起来大致如下:

  1. 该应用程序将redirect用户到您的networking服务器。
  2. networking服务器开始LinkedInauthenticationstream程,并将用户redirect到LinkedIn。
  3. 用户loginLinkedIn,并redirect到您的networking服务器。
  4. Web服务器读取响应,并与LinkedIn交换授权码以获取访问令牌。
  5. networking服务器将您的用户redirect回应用程序,使用自定义urlscheme发送LinkedIn访问令牌。
  6. 该应用程序使用LinkedIn访问令牌login到Stormpath。

听起来很复杂 这实际上比看起来更直接。 我实际上使用Express.js&Swift为这个stream写了一些演示代码 。 此示例最终将访问令牌发送到Stormpath以最终对用户进行身份validation,但是您始终可以用您自己的代码调用LinkedIn REST API来获取configuration文件的信息 。

在Swift 3.0中,应该为FacebookLinkedIn添加UIApplicationOpenURLOptionsKey

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { if LISDKCallbackHandler.shouldHandle(url) { return LISDKCallbackHandler.application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: nil) } else { return FBSDKApplicationDelegate.sharedInstance().application(app, open: url , options: options) } } 

更新江泽民议员的答案; 更改是服务器+移动端的令牌访问。 来源: https : //developer.linkedin.com/docs/ios-sdk-auth

我知道这已经被回答了,但是我也遇到了这个问题,并且在接受的答案中做了所有的事情,但是无论如何,代码仍然没有成功或者失败。 事实certificate,对于iOS 9,以下内容已被弃用。

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 

解决的办法是用这个代替:

 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options 

例如,你可以这样做:

 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options { if ([LISDKCallbackHandler shouldHandleUrl:url]) { return [LISDKCallbackHandler application:app openURL:url sourceApplication:options[UIApplicationLaunchOptionsSourceApplicationKey] annotation:options[UIApplicationLaunchOptionsAnnotationKey]]; } return YES; }