【问题标题】:Xamarin.Auth FacebookXamarin.Auth Facebook
【发布时间】:2014-12-13 15:52:38
【问题描述】:

好的,所以我尝试使用 Xamarin.Auth 在 Xamarin.iOS 上进行非常基本的身份验证,但出现错误:“应用程序配置不允许给定 URL。:一个或多个给定 URL 不可用应用程序的设置允许。它必须与网站 URL 或画布 URL 匹配,或者域必须是应用程序域之一的子域。"

我已经在谷歌上搜索了一段时间,看来您可能无法再将 Xam.Auth 用于 Facebook —— 这似乎不太可能......

这是我的示例代码(没有我的 FB 应用程序 ID)——您会注意到它实际上是 Xam 示例代码的副本:

using System;
using System.Collections.Generic;
using System.Json;
using System.Linq;
using System.Threading.Tasks;
using MonoTouch.Dialog;

#if __UNIFIED__
using Foundation;
using UIKit;
#else
using MonoTouch.Foundation;
using MonoTouch.UIKit;
#endif

namespace Xamarin.Auth.Sample.iOS
{
    [Register ("AppDelegate")]
    public partial class AppDelegate : UIApplicationDelegate
    {
        void LoginToFacebook (bool allowCancel)
        {
            var auth = new OAuth2Authenticator (
                clientId: "SOME_ID",
                scope: "",
                authorizeUrl: new Uri ("https://m.facebook.com/dialog/oauth/"),
                redirectUrl: new Uri ("http://www.facebook.com/connect/login_success.html"));

            auth.AllowCancel = allowCancel;

            // If authorization succeeds or is canceled, .Completed will be fired.
            auth.Completed += (s, e) =>
            {
                // We presented the UI, so it's up to us to dismiss it.
                dialog.DismissViewController (true, null);

                if (!e.IsAuthenticated) {
                    facebookStatus.Caption = "Not authorized";
                    dialog.ReloadData();
                    return;
                }

                // Now that we're logged in, make a OAuth2 request to get the user's info.
                var request = new OAuth2Request("GET", new Uri ("https://graph.facebook.com/me"), null, e.Account);
                request.GetResponseAsync().ContinueWith (t => {
                    if (t.IsFaulted)
                        facebookStatus.Caption = "Error: " + t.Exception.InnerException.Message;
                    else if (t.IsCanceled)
                        facebookStatus.Caption = "Canceled";
                    else
                    {
                        var obj = JsonValue.Parse(t.Result.GetResponseText());
                        facebookStatus.Caption = "Logged in as " + obj["name"];
                    }

                    dialog.ReloadData();
                }, uiScheduler);
            };

            UIViewController vc = auth.GetUI ();
            dialog.PresentViewController (vc, true, null);
        }

        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            facebook = new Section ("Facebook");
            facebook.Add (new StyledStringElement("Log in", () => LoginToFacebook (true)));         
            facebook.Add (new StyledStringElement("Log in (no cancel)", () => LoginToFacebook (false)));
            facebook.Add (facebookStatus = new StringElement (String.Empty));

            dialog = new DialogViewController (new RootElement ("Xamarin.Auth Sample") {
                facebook,
            });

            window = new UIWindow (UIScreen.MainScreen.Bounds);
            window.RootViewController = new UINavigationController (dialog);
            window.MakeKeyAndVisible ();

            return true;
        }

        private readonly TaskScheduler uiScheduler = 
            TaskScheduler.FromCurrentSynchronizationContext();

        UIWindow window;
        DialogViewController dialog;

        Section facebook;
        StringElement facebookStatus;

        // This is the main entry point of the application.
        static void Main (string[] args)
        {
            UIApplication.Main (args, null, "AppDelegate");
        }
    }
}

【问题讨论】:

  • 您是否已将 URL "http://www.facebook.com/connect/login_success.html" 作为有效的重定向 URL 添加到您在 Facebook 上的应用配置?我希望您拥有域中的 URL,这看起来像您从示例中复制的内容。
  • 你是个天才,我觉得有点傻。这就是我这周熬夜太多的原因。谢谢克里斯!如果您愿意,请将您的回复作为答案,我很乐意接受。

标签: c# facebook oauth-2.0 xamarin


【解决方案1】:

您是否已将 URL "http://www.facebook.com/connect/login_success.html" 作为有效的重定向 URL 添加到您在 Facebook 上的应用配置?

我希望您拥有域中的 URL,这看起来像是您从示例中复制的内容

【讨论】:

  • 仅供参考,我必须在设置 --> 高级中更改我的“有效 OAuth 重定向 URI”。发布此内容以防 Facebook 开发人员设置发生更改。
  • Kris,很抱歉这些问题可能看起来很愚蠢,但我确实在谷歌上搜索了很多关于这个主题的内容,但没有找到答案。 1. 为什么登录成功后需要自己的URL? 2. 如果我的应用只需要通过facebook认证(不分享)用户,我还需要这个URL吗? 3. 本机平台(Android 和 iOS)的示例没有此 URL 的用户身份验证工作正常。为什么我们在 Xamarin.Forms 项目中需要它?
  • @OussamaAlRifai -- 您只需要 URL,因为 Xamarin Auth 正在侦听包含身份验证代码作为查询参数的 Web 视图中的重定向。通常您的应用服务器会这样做,但由于它是一个电话应用程序,它们会劫持该 url 并提取代码以执行其余的 oauth 过程。此外,它是额外的安全层,因为 Oauth 提供程序只会重定向到您在提供程序站点上为其配置的 url。
【解决方案2】:

redirect_url 取决于在服务器端定义的服务提供商和应用程序类型(谷歌称之为控制台)。基本上有两种类型的应用程序:Server-AKA-Web 和 Mobile-AKA-Installed。 Server-AKA-Web 几乎总是使用授权码授权,而 Mobile-AKA-Installed 可以使用隐式授权流或修改未发送 client_secret(并且不存在于设备上)的授权码授权流,因为它被认为是不安全的。 Server-AKA-Web 用于服务器(Web 应用程序),恶意用户获取 client_secret 要复杂得多。服务器可以打开任何网页(http[s] 方案) - 通常是同一主机上的某些页面/路由/路径,但也可能是其他内容。

Xamarin.Auth 使用这种在浏览器中打开某些页面并分析 url 以获取返回的 OAuth 数据的方法。它无法解析 http[s]://localhost 什么是有效的 redirect_url,但移动应用程序没有 Web 服务器来拥有 localhost 可加载页面。此外,Xamarin.Auth 永远无法与 facebook 的 fb22145312 等自定义方案一起使用。

这已随版本 v.1.4 发生变化,该版本增加了对自定义方案的支持,现在需要使用 google OAuth 身份验证来对 Mobile-AKA-Installed 应用程序进行嵌入式 WebViews 并且移动应用程序必须使用所谓的本机 UI - 在 Android [Chrome] CustomTabs 上在 iOS SFSafariViewController 上。他们需要自定义方案来进行深度 AKA 应用链接,因此 redirect_url 可以被注册该方案的移动应用拦截。

因此,如果您的应用是网络应用,那么您可以为 redirect_url 使用 http[s] 方案,但如果您选择了 Android 或 iOS 应用,则提供商(在本例中为 Facebook)将为必须使用的应用生成方案。

提供者有不同的方法来检查请求的有效性,并且似乎您的应用程序在服务器端的其他数据(网站、有效网址与您的 redirect_url 不同)。这解释了您收到的错误消息的最后一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多