在使用类似微博的开放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} 授权码:{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} 授权码:{code}"; }
对,就这么简单,完成了。不信?试试看。
1、运行程序,点击按钮,开始授权。
2、登入后,点授权。
3、授权完后,刚才弹出的窗口自动关闭。
Nice,大功告成。