2016-01-24 126 views
0

我想要实现与Facebook的登录我的服务(可通过网络进行访问,以及一个原生Android)实现的oauth2登录与服务器和移动应用

这是我做的Web部件:

  1. 用户点击登录Facebook的
  2. 它被定向到FB的页面,它会检查凭据
  3. 它重定向到一个页面上我的web服务,从细节
  4. 然后,我自己的服务创造供其使用的访问令牌,并且将其作为一个JSON输出到客户端。

我想知道如何可以使用Android来实现。如果我在我的应用程序中使用Web视图,用户将不得不登录Facebook(我想避免)。相反,如果他使用Facebook应用在Facebook上登录,它应该直接转到权限。

如果我使用Android的原生SDK,我不知道如何执行重定向到我自己的服务器,并为自己的网站的访问令牌。

回答

0

如果要授予用户访问令牌为您的网站(通过控制面板 - >选择平台),那么你就应该落实Facebook在自己的网站提供的登录过程,并在你的应用程序设置页(在你的Facebook开发者帐户页面)启用您的Web应用程序。

快速入门:https://developers.facebook.com/docs/facebook-login/web

+0

这如何回答我的问题? –

+0

因为为什么要使用web视图获取用户登录到自己的Facebook帐户,FB SDK为您提供了原生的Android登录对话框(您的用户是否通过FB应用程序登录或没有),并在FB应用程序的情况下,不可用,FB做了一个回退,将为您的用户提供一个对话框,其中有一个webview可以登录...所以,根据你上面提到的(你知道的),唯一的逻辑需求是你想让你的用户登录你的网站和你的原生Android应用程序,这就是为什么我提供给你的原因在您的答案的这一部分执行登录网络 –

0

你可以在原生Android你在网上也做了相同的。

只是Facebook Authentication for android

我也有同样的情况下,作为倒下你我已经成功地用我自己的Web服务来实现。

private void doFacebookLogin(View v) { 
     final View snakeBarView = v; 
     callbackManager = CallbackManager.Factory.create(); 
     LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email", "public_profile")); 
     LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 

       Snackbar.make(snakeBarView, "Facebook Login Success", Snackbar.LENGTH_SHORT).show(); 
       GraphRequest.newMeRequest(
         loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { 
          @Override 
          public void onCompleted(JSONObject json, GraphResponse response) { 
           if (response.getError() != null) { 
            // handle error 
            System.out.println("ERROR"); 
           } else { 
            System.out.println("Success"); 
            try { 
             String jsonresult = String.valueOf(json); 
             String emailId, id, name, profilePicture; 
             if (json.isNull("id")) 
              id = ""; 
             else 
              id = json.getString("id"); 
             if (json.isNull("email")) 
              emailId = id + "@facebook.com"; 
             else 
              emailId = json.getString("email"); 

             if (json.isNull("name")) 
              name = ""; 
             else 
              name = json.getString("name"); 

             profilePicture = getString(R.string.fbProfilePicUrl) + id + "/picture?type=large"; 
             Registration registration = new Registration(); 
             registration.Name = name; 
             registration.EmailId = emailId.toUpperCase(); 
             registration.ProfilePicture = profilePicture; 
             registration.PhoneNumber = ""; 
             registration.Area = ""; 
             registration.Password = ""; 
             ghilliHelper.signupOrLoginPreStep(registration); 
            } catch (JSONException e) { 
             e.printStackTrace(); 
            } 
           } 
          } 

         }).executeAsync(); 
      } 

      @Override 
      public void onCancel() { 
       Snackbar.make(snakeBarView, "Facebook Login Cancelled", Snackbar.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onError(FacebookException e) { 
       Snackbar.make(snakeBarView, "Facebook Login Error", Snackbar.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

成功Facebook登录后获取电子邮件ID并从应用程序调用您的服务。

您的服务。

检查电子邮件ID是存在或不

如果电子邮件ID不存在,创建一个帐户,并返回一个JSON作为登录成功

否则返回JSON作为登录成功。

Web服务

[HttpPost] 
     public async Task<string> SocialMediaLogin(Registration reg) 
     { 
      LoginResult logResult = new LoginResult(); 

      try 
      { 
       CloudTableClient tableclient = _storageAccount.CreateCloudTableClient(); 
       CloudTable table = tableclient.GetTableReference(_registrationTable); 

       if (!table.Exists()) 
       { 
        logResult.Failure = true; 
       } 
       else 
       { 
        TableQuery<Registration> query = new TableQuery<Registration>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, reg.EmailId.ToUpper())); 
        Registration reg_obj2 = new Registration(); 
        IEnumerable<Registration> ienum_obj = table.ExecuteQuery(query); 
        if (ienum_obj.Count() != 0) 
        { 
         foreach (var a in ienum_obj) 
         { 
          logResult.Success = true; 
          logResult.UserDetails = a; 
         } 

        } 
        else 
        { 
         RegistrationResult signupResult = await SocialMediaSignup(reg); //Create an Account 
         if (signupResult.Success) 
         { 
          logResult.Success = true; 
          logResult.UserDetails = signupResult.UserDetails; 
         } 
         else if (signupResult.Failure) 
         { 
          logResult.Failure = true; 
         } 
        } 
       } 
      } 
      catch (Exception) 
      { 
       logResult.Failure = true; 
      } 
      var resultString = JsonConvert.SerializeObject(logResult); 
      return resultString; 
     } 
+0

的步骤“检查电子邮件ID是否存在”,我如何确保其不是恶意的邮寄请求到我的服务? –

+0

@harvey_slash好问题。您可以从证书创建一个AD令牌。在这种情况下,我们可以避免恶意帖子请求。 –

+0

的任何例子? –

相关问题