Аутентификация пользователя с Instagram на iOS: указание uri перенаправления
Я разрабатываю приложение iOS (используя Swift), которое позволяет пользователю аутентифицироваться через Instagram с помощью OAuth 2.0
в прошлом все работало нормально, поскольку я смог указать URL-адрес авторизации как таковой:
https://api.instagram.com/oauth/authorize/?client_id=xxx&redirect_uri=myiosapp://authorize&response_type=code
ключевым моментом здесь является параметр redirect_uri myiosapp://authorize
моя проблема в том, что я больше не могу зарегистрировать пользовательскую схему url с Instagram, тем самым делая это невозможным(?) обрабатывать перенаправление исключительно через my приложение. Если я попытаюсь добавить такой URI в поле" допустимый URI перенаправления:", я получу следующую ошибку:
You must enter an absolute URI that starts with http:// or https://
каков рекомендуемый способ обработки аутентификации с помощью Instagram исключительно для родного приложения iOS?
1 ответов
после выяснения этого, я думал, что опубликую свое решение для всех, кто сталкивается с той же проблемой.
прежде всего, я просто соглашусь с тем, что Instagram больше не разрешает пользовательские схемы в поле "безопасность" -> "допустимый URIs перенаправления". Вместо этого я введу произвольный, но действительный URI, который я могу однозначно идентифицировать. Например: http://www.mywebsite.com/instagram_auth_ios
теперь, при попытке авторизации с Instagram, я буду использовать это как URI перенаправления-даже если веб-страницы на самом деле не существует на этом URI.
Пример: https://api.instagram.com/oauth/authorize/?client_id=xxx&redirect_uri=http://www.mywebsite.com/instagram_auth_ios&response_type=code
наконец, я буду использовать UIWebViewDelegate
' s shouldStartLoadWithRequest
метод для перехвата запроса перенаправления до его запуска и вместо этого вызовите мой оригинальный пользовательский uri (таким образом, мне не нужно ничего переписывать). Вот как я написал этот метод:
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
guard let url = request.URL where url.host == "www.mywebsite.com" && url.path == "/instagram_auth_ios" else { return true }
guard let authUrl = NSURLComponents(URL: url, resolvingAgainstBaseURL: false) else { return true }
// Customize the scheme/host/path, etc. as desired for your app
authUrl.scheme = "myappschema"
authUrl.host = "instagram"
authUrl.path = ""
UIApplication.sharedApplication().openURL(authUrl.URL!)
return false
}
есть одно небольшое предостережение с возвращением false в методе shouldStartLoadWithRequest в том, что он всегда будет жаловаться на ошибку "Frame Load Interrupted". Похоже, это ни на что не влияет. и можно (вероятно) безопасно игнорировать.