刚才再看core的东西,然而理解力太低,问问大神们写的啥,大神也很忙,算了。
想想还是做下上个项目总结好了,将来可能用的着。
第三方登录,虽然这部分不是我做的,不是你做的你还贴!项目总结嘛,又不一定是要我做的才能总结。
本次项目用到5个第三方登录,分别是MicroSoft,qq,微信,微博,GitHub。
先吐槽下,程序其实没什么难点,但是审批。。。。尤其是企鹅,就他破事最多,文字图标都不能改。
1).MicroSoft的
前台:
<a href="https://login.live.com/oauth20_authorize.srf?client_id=*******&scope=wl.basic&response_type=token&redirect_uri=https://www.*******.com.cn/********/Win&state=ClientStateGoesHere" title="MicroSoftAccount登录"><img src="~/Content/Images/Login/icon_win.png" /></a>
显示效果就是上面那个win图标。
client_id就是 你去ms那里注册的应用的id,我之前搜别人教程的时候发现他们的clientid都是10左右的一串字符串,而我现在注册的都是guid,不论国内国外。
还有一个比较坑的地方,在ms注册的应用必须是https的(反正人家不让我注册http的)。
可我看到有别的网站用ms第三方redirect_uri后面写的是http的,不知道他们怎么弄的。
至于scope和state没注意是啥,啥时候用得着再去看。
win那个方法我们是直接return了个view()
view里面是这样,直接去了token又丢后台=-=
$(document).ready(function () { var access_token = window.location.hash; access_token = access_token.split(‘&‘)[0].split(‘=‘)[1]; //后面就是用ajax把access_token传到后台
});
后台:
var result = HttpService.Get(" https://apis.live.net/v5.0/me?access_token=" + access_token);
var obj = JsonConvert.DeserializeObject(result);
JObject userobj = (JObject)obj;
var name= userobj["name"].ToString();
var id = userobj["id"].ToString();
这样ms的就完成了,之后你比如想做本地注册反正name啥都有。
2).微信
前台:
<a href="https://open.weixin.qq.com/connect/qrconnect?appid=wx**********&redirect_uri=http://www.****.com.cn/****/Wechart&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect" title="微信登录"><img src="~/Content/Images/Login/icon_wechat.png" /></a>
你看这边的redirect_uri就不要求https,然后wechart方法是长这样的:
var result = HttpService.Get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + wechartclientId + "&secret=" + wechartclientSecret + "&code=" + code + "&grant_type=authorization_code");
var obj = JsonConvert.DeserializeObject(result);
JObject accobj = (JObject)obj;
string accessToken = accobj["access_token"].ToString();
string openid = accobj["openid"].ToString();
if (accessToken.Length > 0)
{
result = HttpService.Get("https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid);
obj = JsonConvert.DeserializeObject(result);
JObject userobj = (JObject)obj;
var name= userobj["nickname"].ToString();
var logo = userobj["headimgurl"].ToString();
}
其中code微信那边丢过来的,wechartclientId和wechartclientSecret自然是去微信那边申请联动获得的2333.
微信结束。
3). qq
前台:
<a href="https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=*****&redirect_uri=@Server.HtmlEncode("http://www.*****.com.cn/***/QQ")&state=test&scope=get_user_info" title="QQ登录"><img src="~/Content/Images/Login/icon_qq.png" /></a>
然后qq(这名字。。)这方法这样的 :
var result = HttpService.Get("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=" + qqclientId + "&client_secret=" + qqclientSecret + "&code=" + code + "&redirect_uri=" + @Server.HtmlEncode("http://www.××××××.com.cn/××××××/QQ"));
string accessToken = result != null ? result.Split(‘&‘)[0].Split(‘=‘)[1] : "";
if (accessToken.Length > 0){
result = HttpService.Get("https://graph.qq.com/oauth2.0/me?access_token=" + accessToken);
result = result.Substring(result.IndexOf(‘(‘) + 1);
result = result.Substring(0, result.IndexOf(‘)‘));
var obj = JsonConvert.DeserializeObject(result);
JObject userobj = (JObject)obj;
string openid = userobj["openid"].ToString(); result = HttpService.Get("https://graph.qq.com/user/get_user_info?access_token=" + accessToken + "&oauth_consumer_key=" + qqclientId + "&openid=" + openid); obj = JsonConvert.DeserializeObject(result); userobj = (JObject)obj;
var name= userobj["nickname"].ToString(); var logo = userobj["figureurl_qq_2"].ToString(); }
我是不知道这个httpservice.get中的redirect_uri有啥用,验证?反正不是我写的,我就记录下而已23333,下一个下一个。
4).微博
前台:
<a href="https://api.weibo.com/oauth2/authorize?client_id=*****&redirect_uri=http://www.*****.com.cn/*****/Weibo&response_type=code" title="微博登录"><img src="~/Content/Images/Login/icon_sina.png" /></a>
weibo方法:
var result = HttpService.Post("", "https://api.weibo.com/oauth2/access_token?client_id=" + weiboclientId + "&client_secret=" + weiboclientSecret + "&grant_type=authorization_code" + "&code=" + code + "&redirect_uri=http://www.*****.com.cn/****/Weibo", false, 10000);
var obj = JsonConvert.DeserializeObject(result);
JObject acctokenobj = (JObject)obj;
if (acctokenobj != null)
{
string access_token = acctokenobj["access_token"].ToString();
string uid = acctokenobj["uid"].ToString();
result = HttpService.Get("https://api.weibo.com/2/users/show.json?access_token=" + access_token + "&uid=" + uid); obj = JsonConvert.DeserializeObject(result);
JObject userobj = (JObject)obj;
var name= userobj["screen_name"].ToString();
var id = userobj["id"].ToString();
var logo = userobj["profile_image_url"].ToString(); }
大同小异。
5).GitHub
前台:
<a href="https://github.com/login/oauth/authorize?client_id=******&scope=user,public_repo" title="GitHub登录"><img src="~/Content/Images/Login/icon_github.png" /></a>
诶,没有redirecturi,那是因为这个是要在github那边配的,我就不贴了。
后台:
var result = HttpService.Get("https://github.com/login/oauth/access_token?client_id=" + githubclientId + "&client_secret=" + githubclientSecret + "&code=" + code);
string accessToken = result != null ? result.Split(‘&‘)[0].Split(‘=‘)[1] : "";
if (accessToken.Length > 0)
{
result = HttpService.Get("https://api.github.com/user?access_token=" + accessToken);
var obj = JsonConvert.DeserializeObject(result);
JObject userobj = (JObject)obj;
var name = userobj["login"].ToString();
var id = userobj["id"].ToString();
var logo = userobj["avatar_url"].ToString();
}
很好,第三方登录的贴完了。
除了ms的,其他都是用的一种写法,就是在后台中再请求一次之前的地址,大概,我也没细看,能用就行。
本来想一篇全写完的,想想好像有点长,分开好了。
下篇总结啥呢?我先想想。