【问题标题】:Authenticating user with Facebook using Servicestack (Java & Swift)使用 Servicestack (Java & Swift) 对 Facebook 用户进行身份验证
【发布时间】:2017-08-18 00:39:40
【问题描述】:

我在我的 Android(Java) 和 iOS(Swift) 应用程序中使用 servicestack 客户端,但我需要使用 facebook 和 google 对用户进行身份验证,你知道是否存在像 Xamarin.Auth 这样的模块https://github.com/xamarin/Xamarin.Auth 但对于本机应用程序?

谢谢

【问题讨论】:

    标签: servicestack servicestack-auth


    【解决方案1】:

    看看AndroidJavaChat,它是C# Xamarin.Android Chat 的一个端口,它解释了几种使用Facebook 的SDK 进行身份验证的不同方法,并利用ServiceStack v4 中对使用AccessToken 进行身份验证的新支持。 5.7+ 现在是available on MyGet

    首先按照此入门指南前往install Facebook's SDK

    然后检查 LoginButtonActivity 的实现,它使用 Facebook 登录按钮进行身份验证,您可以在 Layout.xml 中定义该按钮:

    <com.facebook.login.widget.LoginButton
        android:id="@+id/btnFacebookLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="30dp" />
    

    Signing in with Facebook Login Button

    要使用 Facebook 的 SDK,您的 AppId 需要在 AndroidManifest.xml 中定义:

    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
    

    ApplicationId 用于您在https://developers.facebook.com/apps 中创建的应用中的Facebook 应用

    然后您可以通过在LoginButton 上注册回调来使用 Facebook 登录按钮进行身份验证。之后,只需处理 Facebook onSuccess()onCancel()onError() 回调即可。当onSuccess() 回调被触发时,这意味着用户已经成功登录到我们的Android 应用程序,然后我们需要通过使用用户的Facebook AccessToken 发出经过身份验证的请求来向我们的ServiceStack 聊天服务器进行身份验证,例如:

    facebookCallback = CallbackManager.Factory.create();
    btnFacebookLogin = (LoginButton) findViewById(R.id.btnFacebookLogin);
    btnFacebookLogin.setReadPermissions("email"); // Ask user for permission to view access email address
    btnFacebookLogin.registerCallback(facebookCallback, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            UiHelpers.setStatus(txtStatus, "Local facebook sign-in successful, signing into server...");
    
            App.get().getServiceClient().postAsync(new dtos.Authenticate()
                .setProvider("facebook")
                .setAccessToken(loginResult.getAccessToken().getToken())
                .setRememberMe(true),
                r -> {
                    UiHelpers.setStatus(txtStatus, "Server facebook sign-in successful, opening chat...");
                    Intent intent = new Intent(activity, MainActivity.class);
                    stopProgressBar();
                    startActivity(intent);
                },
                error -> {
                    UiHelpers.setStatusError(txtStatus, "Server facebook sign-in failed", error);
                    stopProgressBar();
                });
        }
    
        @Override
        public void onCancel() {
            stopProgressBar();
        }
    
        @Override
        public void onError(FacebookException exception) {
            Log.e(exception);
            stopProgressBar();
        }
    });
    

    一旦用户通过 ServiceStack 服务器进行身份验证,已在服务客户端上配置了经过身份验证的会话 Cookie,您现在可以使用它来发出经过身份验证的请求。

    如果您想使用自己的自定义图像作为登录按钮进行登录,请按照Signing in with Custom Facebook Image Button 中的步骤操作。

    Automatically Sign-In previously Signed In Users

    用户第一次成功通过 Facebook 身份验证后,您可以从 Facebook 的 AccessToken.getCurrentAccessToken() 访问他们保存的令牌,以自动登录以供将来重新启动,例如:

    AccessToken facebookAccessToken = AccessToken.getCurrentAccessToken();
        if (facebookAccessToken != null){
            client.postAsync(dtos.Authenticate()
                .setProvider("facebook")
                .setAccessToken(facebookAccessToken.getToken())
                .setRememberMe(true),
                r -> {
                    //User has signed using Saved Access Token
                });
        }
    

    【讨论】:

    • 谢谢,nuget 中 ServiceStack v4.5.7 的预计发布日期是什么时候?我可以在生产中使用它的版本吗?
    • @LestherVega 奇数仅在 MyGet 上,偶数在 NuGet 上。希望下周在 NuGet 上发布 v4.5.8,但您可以在生产环境中使用 v4.5.7(使用与 NuGet 构建相同的 CI 并通过相同的测试套件)adding the MyGet feed
    • 它适用于 facebook 但使用 googleoauth 提供程序我收到错误:System.StackOverflowException 未处理 消息:未处理的异常ServiceStack.Authentication.OAuth2.dll 中发生“System.StackOverflowException”类型的有什么想法吗?
    • 我正在像这样stackoverflow.com/questions/33998335/… 发送 googleapis 的 access_token
    • @LestherVega StackOverflowException 现在应该是 fixed with this commit,它现在在 MyGet 上,您可以使用 redownload after clearing your NuGet cache
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多