Jen

Facebook Graph API 與 .Net (一) - Profile API 實作

最近遇到一個很趕流行的需求,直接可以讓會員使用他們的 Facebook 帳號登入,透過授權直接取得該會員的資料,而不需要另行註冊,這是時下網站很愛的一個功能,你的網站沒有這個功能就不算跟得上時代,所以不管怎樣都要弄一個來帥一下,不過這個東西的確可以幫你的網站降低非常多的召收會員的門檻。

怎麼與你的會員機制接在一起呢 ? 其實很簡單,我們只是把「驗證」這個步驟丟到 Facebook 去處理,也就是輸入帳號、密碼我們不做了(好像在講廢話)。而這次我不打算自已刻一個會員機制,我選擇了 .Net 2.0 時所提供的「網頁安全性管理 API」,而我用到了三個 API:

  • Role API : 幫你的網站使用者分類群組 。
  • Memebership API : 記錄驗證使用者時需要的資訊。
  • Profile API : 一些非必須的資料,在這裏我是拿來記錄會員在 Facebook 中的基本資料。

知道的人或許很多,但真的有在用這套 API 的似乎很少,就我認識的是沒有,大家都很愛不斷地發重新明輪子。而這一篇要分享的就是 Profile API 在 「WebSite 專案」及「非Web Site 專案」實作上的差異。

ps.以下所有在程式碼中看到的 Profile,都是登入情況下使用的。匿名 Profile 又是另外一件事了。

不管你用以上哪個 API ,首先使用.Net Framework提供的 aspnet_regsql 工具產生資料庫要用的表格。(aspnet_regsql 用法可以參考 這裏)
 aspnet_regsql -E -S JEN-PC\SQLEXPRESS -A mrp -d mydatabase


結果:










「 Web Site 專案」的實作方式如下:
Web.Config


    
    
    
	
		
		
		
		
		
	

ASPX Page , 會根據 web.config 自動產生強型別的 Profile。
protected void Page_Load(object sender, EventArgs e)
{
    Profile.first_name = "my first name";
    Profile.last_name = "my last name";
    Profile.link = "my link";
    Profile.locale = "my locale";
    Profile.id = "my id";
    Profile.Save();  
}

但是,在「非 WebSite」的專案中則無法這樣使用,例如 ASP.NET MVC  Project ,實作方式就不一樣。
首先,把 Web.Config 中 profile 區段的 properties 拿掉。


    
    
    

第二,定義一個繼承自 ProfileBase 的類別,包含一些儲存會員資訊時需要用到的屬性,以下程式碼就是定義用來儲存Facebook 個人資料的屬性。
public class UserProfile : ProfileBase
{
    public virtual string id 
    {
        get 
        {
            return ((string)(this.GetPropertyValue("id")));
        }
        set 
        {
            this.SetPropertyValue("id", value);
        }
    }
    public virtual string first_name
    {
        get
        {
            return ((string)(this.GetPropertyValue("first_name")));
        }
        set
        {
            this.SetPropertyValue("first_name", value);
        }
    } 
    // ...省略   

    public virtual UserProfile GetProfile(string username)
    {
        return ((UserProfile)(ProfileBase.Create(username)));
    }
}

聰明的你注意到了最後面那個 GetProfile(string username) 的方法,呼叫了父類別的 Create(),在這裏你可以為剛加入的 Member 建立新的 Profile ,或者取得舊會員已存在的Profile。以下是一個簡單的範例。
// 從 facebook 取得會員資料
dynamic fbUser = facebookService.GetUserData(access_token.access_token);
if (fbUser != null)
{
    if (fbUser.verified)
    {
        //建立 (或取得) 會員
        MembershipUser NewMember = Membership.GetUser(fbUser.email) ?? Membership.CreateUser(fbUser.email, "facebook");
        //取得 ticket 然後登入
        FormsAuthentication.SetAuthCookie(NewMember.UserName, true);
        //建立 (或取得) 該會員的 Profile,然後更新.
        UserProfile profile = (UserProfile)UserProfile.Create(NewMember.UserName,true);
        profile.id = fbUser.id;
        profile.first_name = fbUser.first_name;
        profile.last_name = fbUser.last_name;
        profile.locale = fbUser.locale;
        profile.verified = fbUser.verified;
        profile.Save(); //最後更新到Database

    }              
}

最後這些 Profile 資料都會存在資料庫  aspnet_Profile  的表格中囉。
其實這個 API 很好用, 而這一 PO 似乎還沒跟 Facebook Graph API 扯上關係,就下一篇吧。

下一篇:Facebook Graph API 與 .Net  (二) - 還沒想到…

aspnet_regsql 
設定SQL Server 儲存ASP.NET Session State (Cookieleses)


8 意見:

  匿名

2013年5月22日 上午6:01

I'm curious to find out what blog platform you happen to be

utilizing? I'm having some small security issues with my
latest site and I would like to find something more safe.
Do you have any recommendations?

Also visit my blog: sukru3arbade.net

  匿名

2013年5月22日 上午9:19

Hi there, i read your blog from time to time and
i own a similar one and i was just

curious if you get a lot of spam remarks? If so how do you reduce it, any plugin or anything you
can suggest? I get so much lately it's driving me mad so any help is very much appreciated.

Feel free to surf to my web blog - virgin media news

  匿名

2013年5月22日 下午2:21

whoah this blog is excellent i love reading your articles.
Keep up the

great work! You know, a lot of people are looking around
for this info, you can help them greatly.


Feel free to visit my site: mojave airplane graveyard tour

  匿名

2013年5月22日 下午4:27

You made some respectable factors there. I appeared on the


internet for the difficulty and located most people will

go along with along with your website.

my webpage: property equestrian property derbyshire

  匿名

2013年5月24日 上午7:51

I would like to thnkx for the efforts you've put in writing this site. I'm hoping the same high-grade website post from you in the upcoming as well.


Actually your creative writing skills has inspired me to get my
own site

now. Actually the blogging is spreading its wings
quickly. Your write up is a good

example of it.

Here is my blog :: www.villaagent.net

  匿名

2013年5月27日 上午1:37

I like what you guys are up also. Such smart work and reporting!
Keep up the

superb works guys I have incorporated you guys to my blogroll.
I think it will improve the value

of my site :)

Also visit my blog miraslow.com

  匿名

2013年5月27日 下午9:03

Thank you for sharing superb informations. Your website is
so cool. I

am impressed by the details that you’ve on this blog. It reveals how nicely you

perceive this subject. Bookmarked this website page, will come back for more articles.


You, my pal, ROCK! I found just the info I already searched all over the place

and simply couldn't come across. What a perfect site.

Here is my page - http://pkprofessionals.co.uk/groups/camping-tips-every-camper-needs-to-follow/

  匿名

2013年5月27日 下午10:20

It’s actually a nice and helpful piece of
information. I’m glad that you

shared this useful info with us. Please keep us up
to date like this. Thanks for

sharing.

Feel free to visit my web-site - http://www.pcn-e.com/