【问题标题】:iOS linkedin authenticationiOS Linkin 身份验证
【发布时间】:2015-04-14 00:05:36
【问题描述】:

我开始使用 Swift 开发 iOS 应用。现在我需要创建一个登录系统。但是,我们需要人们提供的 LinkedIn 信息。

如何使用 iOS 中的 OAuth2 API 来实现这一点?

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

【问题讨论】:

  • 您是否考虑过尝试使用 LinkedIn SDK?这里是类 LISDKSessionManager。我想注意在这种情况下用户必须已经安装了 LinkedIn 应用程序。

标签: ios swift api linkedin linkedin-api


【解决方案1】:

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

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

  1. 创建一个新的Developer Application
  2. 将您的 iOS 应用程序包标识符添加到移动设备下的 LinkedIn 应用程序。
  3. 将您的 LinkedIn 应用 ID 和 URL 方案添加到应用的 Info.plist 文件中。
  4. 将指定的 LinkedIn URL 方案和 ATS URL 列入白名单。
  5. linkedin-sdk.framework 库复制到您的应用程序。确保选中“必要时复制文件”和“为文件夹引用创建组”。

项目设置完成,现在开始编写代码吧!

创建一个名为BridgingHeader.h 的新头文件。在 Targets -> YourApp -> Build Settings -> Swift Compiler - Code Generation 下,将 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)")
    }
}

登录时,将要求用户通过您的应用程序进行身份验证:

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

要获取我们通过身份验证的用户的信息,请在用户的个人资料上调用 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 做的更多事情。

可以在here找到一个示例项目(我的 App ID 被混淆了)。

【讨论】:

  • 我执行了这个步骤,当我点击我的 loginWithLinkedIn 按钮时,LinkedIn 应用程序从右向左滑动,然后(1 秒后)我的应用程序从右向左滑动,没有任何反应。未调用成功或错误。在这之后;我尝试获取对 hasValidSession 的请求,但又一次没有调用成功,也没有错误。有什么建议吗?
  • 同样的问题,你找到解决办法了吗?
  • 我遇到了同样的问题。我编辑了 AppDelegate 中的方法来解决它。签名略有不同(他们可能已对其进行了更新),并且在返回我的应用程序时从未调用过它。现在它对我有用
  • @AbhishekThapliyal 我有,请参阅我关于桥接头的答案部分。
  • @AbhishekThapliyal 你应该问一个新问题。
【解决方案2】:

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

因此,虽然 JAL 的回答已经足够,但您可能希望考虑在您的移动应用程序中实现 LinkedIn 的 authorization_code OAuth 流程,而不是 LinkedIn SDK。这大致类似于以下流程:

  1. 该应用会将用户重定向到您的网络服务器。
  2. 网络服务器开始 LinkedIn 身份验证流程,并将用户重定向到 LinkedIn。
  3. 用户登录 LinkedIn,并被重定向回您的网络服务器。
  4. 网络服务器读取响应,并与 LinkedIn 交换授权码以获得访问令牌。
  5. 网络服务器将您的用户重定向回应用程序,使用自定义 url 方案向其发送 LinkedIn 访问令牌。
  6. 应用程序使用 LinkedIn 访问令牌登录 Stormpath。

听起来很复杂?它实际上比看起来更简单。我实际上写了一些demo code for this flow using Express.js & Swift。此示例最终将访问令牌发送到 Stormpath 以最终对用户进行身份验证,但您始终可以将其替换为您自己的调用 LinkedIn REST API to grab the profile's information 的代码。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          正如@Edward Jiang 已经解释的那样,由于需要安装 LinkedIn 应用程序,LinkedIn 将整个身份验证过程变得非常笨拙。我编写了一个 Swift 库来处理嵌入的 WKWebView: LinkedInAuth-Swift 中的身份验证通量。

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

          【讨论】:

            猜你喜欢
            • 2012-02-14
            • 2020-06-26
            • 2016-04-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-27
            • 2016-10-09
            相关资源
            最近更新 更多