Introducing Windows Azure Mobile Services – Authentication

提供雲端上的資料儲存是Windows Azure Mobile Services主要的服務之一,一旦牽扯到資料的維護,那麼使用者驗證機制就是必要的工作,Windows Azure Mobile Services

目前在這部分提供了4種認證方式,分別是Microsoft Account(Windows Live)、Google、Facebook及Twitter

文/黃忠成

 

 

About Authentication

 

  提供雲端上的資料儲存是Windows Azure Mobile Services主要的服務之一,一旦牽扯到資料的維護,那麼使用者驗證機制就是必要的工作,Windows Azure Mobile Services

目前在這部分提供了4種認證方式,分別是Microsoft Account(Windows Live)、Google、Facebook及Twitter,會使用這些非自訂的認證使用者方式原因很簡單,現今的使用者驗證已經由

多帳號走向單一帳號整合,以前我們在購物或是瀏覽一些會員制的網站時,總是得申請加入會員,然後填寫一些資料,麻煩就不用提了,帳號越來越多也引發了管理上的問題。

   由於Facebook、Google等網路服務的用戶越來越多,大多數的電腦用戶都擁有這4種服務其中之一的帳號,如果可以能與這些服務整合,那麼開發者就可以省下自行開發使用者認證及

儲存使用者帳密的工作,在某一程度上這也降低了網站洩漏個人資料的風險(舉個例來說,Facebook在使用者帳密驗證的安全性上有一定水準,至少他們對被攻擊的經驗值比我們高 XD)。

   Windows Azure Mobile Services所提供的驗證服務主要是過濾使用其服務,例如資料存取、API呼叫的使用權,以資料存取來說,每個資料表都有相關的權限設定(CRUD)。

圖1

 

舉例來說,假設我們在這裡把READ PERMISSION設定為”Only Authenticated Users”,那麼原本的Windows Phone範例就會出現以下的錯誤。

圖2

 

 

Using Authentication in Windows Phone

 

   本文使用Google Login來展示Authentication在Azure Mobile Services的應用,請先至https://code.google.com/apis/console/網站來取得一個ClientID及SECURITY KEY,這兩個資訊待會要填入Azure Mobile Services服務中才能連結兩端。

圖3

 

圖4

 

這裡先輸入Mobile Services的URL,然後點選more options。

圖5

 

你必須修改Authorized Redirect URLs為<your mobile servcie site>/login/google。

完成後會得到以下的畫面。

圖6

 

接著回到Azure Mobile Service的管理介面,切到IDENTITY頁面,輸入剛剛在Google API Console得到的資訊。

圖7

 

接著修改原來的Windows Phone程式(上篇文章中的例子)。

MainPage.xaml.cs


private IMobileServiceTable _customersTable =   App.MobileService.GetTable();



        private MobileServiceUser user;

        private async System.Threading.Tasks.Task Authenticate()

        {

            while (user == null)

            {

                string message;

                try

                {

                    user = await App.MobileService

                        .LoginAsync(MobileServiceAuthenticationProvider.Google);

                    message =

                        string.Format("You are now logged in - {0}", user.UserId);

                }

                catch (InvalidOperationException)

                {

                    message = "You must log in. Login Required";

                }



                MessageBox.Show(message);

            }



        }


        // Constructor

        public MainPage()

        {

            InitializeComponent();

            Loaded += MainPage_Loaded;

            // Sample code to localize the ApplicationBar

            //BuildLocalizedApplicationBar();

        }


        async void MainPage_Loaded(object sender, RoutedEventArgs e)

        {

            await Authenticate();

            InitData();

        }

.................

 

 

 

一切無誤的話程式應該會導引驗證並成功取得資料。

圖8

 

圖9

 

 

 

Using Authentication in Android

 

  在Android中使用也很簡單,我們修改上篇文章的例子。

 

MainActivity.java


import com.microsoft.windowsazure.mobileservices.MobileServiceUser;

import com.microsoft.windowsazure.mobileservices.MobileServiceAuthenticationProvider;

import com.microsoft.windowsazure.mobileservices.UserAuthenticationCallback;


public class MainActivity extends Activity {


    private MobileServiceClient _client;

    private MobileServiceTable _table;

    private CustomersAdapter _adapter;

    public List _list = new ArrayList();

   

    private void authenticate() {



        // Login using the Google provider.

        _client.login(MobileServiceAuthenticationProvider.Google,

                new UserAuthenticationCallback() {



                    @Override

                    public void onCompleted(MobileServiceUser user,

                            Exception exception, ServiceFilterResponse response) {



                        if (exception == null) {

                            createAndShowDialog(String.format(

                                            "You are now logged in - %1$2s",

                                            user.getUserId()), "Success");

                            refreshItemsFromTable();

                        } else {

                            createAndShowDialog("You must log in. Login Required", "Error");

                        }

                    }

                });



        }

   

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        try {

            // Create the Mobile Service Client instance, using the provided

            // Mobile Service URL and key

            _client = new MobileServiceClient(

                    "", "",

                    this);


            // Get the Mobile Service Table instance to use

            _table = _client.getTable(Customers.class);

        } catch (MalformedURLException e) {

            createAndShowDialog(new Exception("There was an error creating the Mobile Service. Verify the URL"), "Error");

        }

       

        _adapter = new CustomersAdapter(this,  android.R.layout.simple_list_item_1);

        ListView listViewToDo = (ListView) findViewById(R.id.listView1);

        listViewToDo.setAdapter(_adapter);

authenticate();

    }

……………………

 

 

 

圖10

 

 

Using Authentication in iOS

 

  在iOS中使用也很簡單,修改上篇文章中的程式。

ViewController.m


- (void)viewDidLoad

{

    [super viewDidLoad];

    self.client = [MSClient clientWithApplicationURLString:@"https://myrest.azure-mobile.net/" applicationKey:@"appkey"];

    self.table = [self.client tableWithName:@"Customers"];

// Do any additional setup after loading the view, typically from a nib.

}

- (void)viewDidAppear:(BOOL)animated

{

    if (self.client.currentUser != nil) {

        return;

    }

    [self.client loginWithProvider:@"google" controller:self animated:YES completion:^(MSUser *user, NSError *error) {

        NSPredicate * predicate = [NSPredicate predicateWithFormat:@"Name=='code6421'"];

        [self.table  readWithPredicate:predicate completion:^(NSArray *results, NSInteger totalCount, NSError *error)

         {

             self.items = [results mutableCopy];

             [self.tableView reloadData];

         }];

    }];    

}

 

 

 

圖11