首页 > 嗟来之食 > 【Win 10 应用开发】Web授权示例:获取新浪微博的授权码 – 东邪独孤 –
2016
07-04

【Win 10 应用开发】Web授权示例:获取新浪微博的授权码 – 东邪独孤 –

在使用类似微博的开放API的时候,会涉及到授权的问题,就拿微博来说,当用户在你的应用中需要调用微博API来处理一些事情时,你首先要让用户登录微博,得到用户授权后,才能调用微博API。
授权通常通过一个web页面来完成,比如打开微博的登录页。估计很多人首先会想到用 WebView 控件来显示登录页,然后让用户登录,当授权后跳转时,从RUI中获取授权码。
其实,根本不用这么麻烦,RT API本身就有Web授权的API,只要准备好授权页的地址和回调地址,简单调用一下API,系统会自动打开一个窗口,让用户授权,授权完后直接从API的返回内容查找授权码。
有了授权码,你就可以用来换Access Token了,换了Access Token后就可以调用微博API了。

到底简单到什么程度呢,咱们试试就知道了。我以新浪微博的开放平台为例。首先你得去开放平台的后台管理中新建一个应用,就可以得到一个 App Key,然后就可以编程了。
先看XAML布局的界面。

<StackPanel Margin="15">
<TextBox Name="txtClientID" Header="client_id" PlaceholderText="你的应用的App Key"/>
<TextBox Name="txtCallbackUri" Margin="0,13,0,16" Header="redirect_uri" Text="https://api.weibo.com/oauth2/default.html"/>

<Button Content="授权" Width="300" Margin="25,2,0,20" Click="OnClick"/>

<TextBlock Name="tbmsg" Foreground="Red" FontSize="18" TextWrapping="Wrap"/>
</StackPanel>

两个TextBox是用来输入app key和回调URI的。
然后直接上代码,简直TMD轻松。

// 你的应用的App key
string clientID = txtClientID.Text;

// 你在开放平台上填写的回调URI
string cbUri = txtCallbackUri.Text;
Uri callbackUri = new Uri(cbUri);

// 新浪微博授权地址
string wbauthUriStr = $"https://api.weibo.com/oauth2/authorize?client_id={clientID}&response_type=code&redirect_uri={cbUri}";

Uri wbAuthUri = new Uri(wbauthUriStr);

// 获取授权
WebAuthenticationResult result = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, wbAuthUri, callbackUri);

// 处理结果
if (result.ResponseStatus == WebAuthenticationStatus.Success)
{
string cburi = result.ResponseData;
// 取得授权码
// code是附加在回调URI后,以?code=xxxxxxxxxxxxxx的形式出现,作为URI的查询字符串
string code = cburi.Substring(cburi.IndexOf('=') + 1);

tbmsg.Text = $"回调URI:{cburi}\n授权码:{code}";
}
else if (result.ResponseStatus == WebAuthenticationStatus.ErrorHttp)
{
tbmsg.Text = "错误:" + result.ResponseErrorDetail.ToString();
}
else if (result.ResponseStatus == WebAuthenticationStatus.UserCancel)
{
tbmsg.Text = "你取消了操作。";
}

代码虽有N行,但不复杂,我简单解释一下,看不懂的请撞墙。
新浪微博的授权URI为https://api.weibo.com/oauth2/authorize?client_id=你的AppKey&response_type=code&redirect_uri=你设置的回调URI
对于我们这种基于客户端的应用,回调URI多余,可是它有要求,你可以随便填,不过,新浪官方准备了一个空白的RUI,你可以用它作为回调用:https://api.weibo.com/oauth2/default.html

授权时,直接调用WebAuthenticationBroker类的AuthenticateAsync方法,方法是静态的,直接可以调用。注意参数,这里,WebAuthenticationOptions一定要设为None,这样当授权完后可以获得完整的回调URI,才能得到授权码。
AuthenticateAsync方法会返回一个WebAuthenticationResult对象,访问该对象的ResponseData属性,你就能获取到回调的URI,并包含?code=xxxxxxxxxx。这样就可以把code拿出来了。

if (result.ResponseStatus == WebAuthenticationStatus.Success)
{
string cburi = result.ResponseData;
// 取得授权码
// code是附加在回调URI后,以?code=xxxxxxxxxxxxxx的形式出现,作为URI的查询字符串
string code = cburi.Substring(cburi.IndexOf('=') + 1);

tbmsg.Text = $"回调URI:{cburi}\n授权码:{code}";
}

对,就这么简单,完成了。不信?试试看。
1、运行程序,点击按钮,开始授权。

2、登入后,点授权。

3、授权完后,刚才弹出的窗口自动关闭。

Nice,大功告成。

示例源代码下载

最后编辑:
作者:
这个作者貌似有点懒,什么都没有留下。

留下一个回复