iOSauthentication
我开始在Swift上开发iOS应用程序。 现在我正在创build一个login系统。 但是我们需要来自人们的LinkedIn信息。
如何在iOS中使用OAuth2 API来实现这一目标?
我已经在LinkedIn开发者区域创build了一个应用程序,但是现在我被卡住了。 我得到了一些人的build议,我需要使用UIWebView
但我不知道这是如何工作的。
将LinkedInlogin整合到Swift应用程序中
首先,下载LinkedIn iOS SDK 。 我将在这个例子中使用1.07稳定版本。 我将在这里遵循集成指南。
- 创build一个新的开发人员申请
- 将您的iOS应用的捆绑标识符添加到您的LinkedIn应用下的移动。
- 将您的LinkedIn应用程序ID和URL Scheme添加到您应用程序的Info.plist文件中。
- 将指定的LinkedIn URLscheme和ATS URL列入白名单。
- 将
linkedin-sdk.framework
库复制到您的应用程序。 确保select“如果需要复制文件”和“创build文件夹引用组”。
项目设置完成,现在让我们写一些代码!
创build一个名为BridgingHeader.h
的新Header文件。 在Target – > 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:
如果用户允许,则会调用成功块,并且可以获取有关已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。 这看起来大致如下:
- 该应用程序将redirect用户到您的networking服务器。
- networking服务器开始LinkedInauthenticationstream程,并将用户redirect到LinkedIn。
- 用户loginLinkedIn,并redirect到您的networking服务器。
- Web服务器读取响应,并与LinkedIn交换授权码以获取访问令牌。
- networking服务器将您的用户redirect回应用程序,使用自定义urlscheme发送LinkedIn访问令牌。
- 该应用程序使用LinkedIn访问令牌login到Stormpath。
听起来很复杂 这实际上比看起来更直接。 我实际上使用Express.js&Swift为这个stream写了一些演示代码 。 此示例最终将访问令牌发送到Stormpath以最终对用户进行身份validation,但是您始终可以用您自己的代码调用LinkedIn REST API来获取configuration文件的信息 。
在Swift 3.0中,应该为Facebook
和LinkedIn
添加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; }