iOS 使用Instagram授权登录

移动端集成Instagram登录授权目前是不支持SDK,需要通过web形式加载url来获取授权信息

1、申请应用

先去https://developers.facebook.com/apps/创建应用,过程比较简单略过。设置完成后进入应用,在控制面板中往下翻会找到Instagram点击设置

这是我添加产品后的

可以看到应用的所有信息,Instagram 应用编号Instagram 应用密钥是自动生成的;Instagram Display 名称自定义;有效 OAuth 跳转 URI需要能正常跳转的网址并且是https开头的,这个后面授权成功会回调跳转;取消授权回调网址数据删除请求网址可以与上面一样。
image.png

往下翻,找到

image.png

添加一名Instagram测试人员(必须添加否则会授权失败)
image.png

到这里Instagram准备工作已经做完了。

2、iOS授权

主要思路就是:通过webView加载获取codeurl,拦截回调的有效 OAuth 跳转 URI获取里面的code值,通过code获取user_idaccess_token,在通过user_idaccess_token获取用户名等信息。

直接上代码:

#import "WebLoginController.h"

@interface InstagramLoginController : WebLoginController

@property (nonatomic, copy) void (^getUserInfoCallback)(BOOL isSuccess, NSDictionary * _Nullable userInfo) ;

@end

#import "InstagramLoginController.h"

#define Instagram_client_id @""
#define Instagram_client_secret @""
#define Instagram_URI @"https://www.baidu.com/"

@interface InstagramLoginController ()

@end

@implementation InstagramLoginController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *urlString = [NSString stringWithFormat: @"https://api.instagram.com/oauth/authorize?client_id=%@&redirect_uri=%@&scope=user_profile,user_media&response_type=code", Instagram_client_id, Instagram_URI];
    
    [self loadUrl:urlString];
    
}

- (BOOL)judgeUrl:(NSString *)urlString {
    if ([urlString hasPrefix:Instagram_URI]) {
        NSString *replaceString = [NSString stringWithFormat:@"%@?code=", Instagram_URI];
        urlString = [urlString stringByReplacingOccurrencesOfString:replaceString withString:@""];
        NSString *code = [urlString stringByReplacingOccurrencesOfString:@"#_" withString:@""];
        NSLog(@"%@", urlString);
        [self getUserDateWidthCode:code];
        
        return NO;
    }
    NSLog(@"%@", urlString);
    return YES;
}

//处理请求用户数据
- (void)getUserDateWidthCode:(NSString *)code {
    
    NSDictionary *params = @{
        @"client_id": Instagram_client_id,
        @"client_secret": Instagram_client_secret,
        @"grant_type": @"authorization_code",
        @"redirect_uri": Instagram_URI,
        @"code": code,
    };
    
    [PublicDialogManager showWaittingInView:self.view];
    [HTTPMANAGER startPostUrl:@"https://api.instagram.com/oauth/access_token" param:params success:^(NSDictionary * _Nullable resultDict) {
        NSLog(@"%@", resultDict);
        NSString *user_id = [resultDict stringWithFilted:@"user_id"];
        NSString *access_token = [resultDict stringWithFilted:@"access_token"];
        if (user_id.length > 0 && access_token.length > 0) {
            NSString *userInfoUrl = [NSString stringWithFormat:@"https://graph.instagram.com/%@?fields=id,username&access_token=%@", user_id, access_token];
            [HTTPMANAGER startGetUrl:userInfoUrl param:nil success:^(NSDictionary * _Nullable resultDict) {
                [PublicDialogManager hideWaittingInView:self.view];
                NSLog(@"%@", resultDict);
                if (self.getUserInfoCallback) {
                    self.getUserInfoCallback(YES, resultDict);
                }
                [self popBack];
            } failure:^(NSError * _Nullable error) {
                [PublicDialogManager hideWaittingInView:self.view];
                if (self.getUserInfoCallback) {
                    self.getUserInfoCallback(NO, nil);
                }
                NSLog(@"%@", error);
                [self popBack];
            }];
        }else {
            [PublicDialogManager hideWaittingInView:self.view];
            if (self.getUserInfoCallback) {
                self.getUserInfoCallback(NO, nil);
            }
            [self popBack];
        }
    } failure:^(NSError * _Nullable error) {
        [PublicDialogManager hideWaittingInView:self.view];
        if (self.getUserInfoCallback) {
            self.getUserInfoCallback(NO, nil);
        }
        [self popBack];
        NSLog(@"%@", error);
    }];
    
}

- (void)popBack {
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

再上一下WebLoginController部分代码:

@interface WebLoginController : BaseViewController

@property (nonatomic, strong) WKWebView *webView ;
@property (nonatomic, strong) NSString *urlString ;

- (void)loadUrl:(NSString *)urlString ;

@end

#import "WebLoginController.h"

@interface WebLoginController ()<WKNavigationDelegate>

@end

@implementation WebLoginController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    WKWebViewConfiguration *webConfiguration = [WKWebViewConfiguration new];
    
    WKWebView *webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds configuration:webConfiguration];
    [self.view addSubview:webView];
    webView.navigationDelegate = self;
    webView.opaque = NO;
    webView.backgroundColor = UIColorHex(#f6f6f6);
    self.webView = webView;
    
    [webView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(navigationBgView.mas_bottom);
        make.left.right.bottom.mas_equalTo(0);
    }];
    
}

- (void)loadUrl:(NSString *)urlString {
    
    NSString *urlStr = urlString;
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    [self.webView loadRequest:request];
    
}

//子类重写
- (BOOL)judgeUrl:(NSString *)urlString {
    return YES;
}

#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    // 获取完整url并进行UTF-8转码
    NSString *strRequest = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];
    if ([self judgeUrl:strRequest]) {
        // 允许跳转
        decisionHandler(WKNavigationActionPolicyAllow);
    }else {
        // 不允许跳转
        decisionHandler(WKNavigationActionPolicyCancel);
    }
}

@end

最后成功获取信息,做一下回调就好了。


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容