iOS linkedin身份验证

时间:2015-02-13 01:52:43

标签: ios swift api linkedin linkedin-api

我开始在Swift中开发iOS应用程序。现在,我正处于创建登录系统所需的部分。但是我们需要来自人们的LinkedIn信息。

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

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

6 个答案:

答案 0 :(得分:29)

在Swift应用程序中集成LinkedIn登录

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

  1. 创建新的Developer Application
  2. 将您的iOS应用程序的Bundle Identifier添加到Mobile下的LinkedIn应用程序中。
  3. 将您的LinkedIn应用ID和网址计划添加到您应用的Info.plist文件中。
  4. 将指定的LinkedIn网址方案和ATS网址列入白名单。
  5. linkedin-sdk.framework库复制到您的应用程序。确保选中“必要时复制文件”和“为文件夹引用创建组”。
  6. 项目设置完成,现在让我们编写一些代码!

    创建一个名为BridgingHeader.h的新Header文件。在目标下 - > YourApp - >构建设置 - > Swift编译器 - 代码生成,将MyApp/BridgingHeader.h添加到“Objective-C Bridging Header”。

    BridgingHeader.h中,添加以下两行:

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

    在AppDelegate.swift中,添加此代码以处理OAuth URL回调:

    斯威夫特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
    }
    

    现在是时候登录用户了。在视图控制器中,假设您有一个“登录”按钮。您的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)")
        }
    }
    

    登录时,系统会要求用户对您的应用进行身份验证:

    LinkedIn

    如果用户允许,将调用成功块,您可以获取有关已验证用户的信息。如果登录失败或用户不允许访问,则将调用失败块,您可以提醒用户发生的问题。

    要获取有关我们通过身份验证的用户的信息,请在用户的个人资料中调用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将包含有关经过身份验证的用户的信息:

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

    进一步阅读docs,了解使用API​​可以做的更多事情。

    可以找到示例项目(我的App ID模糊处理)here

答案 1 :(得分:3)

在Swift 3.0中,应为UIApplicationOpenURLOptionsKeyFacebook添加LinkedIn

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)
    }
}

答案 2 :(得分:2)

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

  • 最终用户需要安装LinkedIn应用程序,否则“登录”按钮会将用户重定向到App Store。
  • 无法在服务器上使用移动访问令牌。请参阅this screenshot
  • 中的LinkedIn's iOS documentation

因此,虽然JAL的答案已经足够,但您可能希望在移动应用程序而不是LinkedIn SDK中实施LinkedIn的authorization_code OAuth流程。这看起来大致如下:

  1. 该应用会将用户重定向到您的网络服务器。
  2. 网络服务器启动LinkedIn身份验证流程,并将用户重定向到LinkedIn。
  3. 用户登录LinkedIn,然后重定向回您的网络服务器。
  4. 网络服务器读取响应,并与LinkedIn交换授权码以获取访问令牌。
  5. 网络服务器将您的用户重定向回应用程序,使用自定义网址方案向其发送LinkedIn访问令牌。
  6. 该应用使用LinkedIn访问令牌登录Stormpath。
  7. 听起来很复杂?它实际上比看起来更直接。我实际上写了一些demo code for this flow using Express.js & Swift。此示例最终将访问令牌发送到Stormpath以最终对用户进行身份验证,但您始终可以使用调用LinkedIn REST API to grab the profile's information的自己的代码替换它。

答案 3 :(得分:1)

我知道这已经得到了回答,但我也遇到了这个问题并完成了接受答案中设置的所有内容,但无论出于何种原因,代码仍然没有成功或失败。事实证明,对于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;
}

答案 4 :(得分:0)

更新Edward Jiang的回答;更改是服务器+移动端的令牌访问。资料来源:https://developer.linkedin.com/docs/ios-sdk-auth

答案 5 :(得分:0)

正如@Edward Jiang所解释的,由于需要安装LinkedIn应用程序,LinkedIn使整个身份验证过程变得非常笨拙。我编写了一个Swift库,用于处理嵌入的WKWebViewLinkedInAuth-Swift中的身份验证流。

该库甚至消除了在服务器中处理LinkedIn响应的必要性。呈现身份验证流的WKWebView实例负责捕获LinkedIn返回的授权代码,并随后请求访问令牌。