【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}
授权码:{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,大功告成。

示例源代码下载

原文地址:https://www.cnblogs.com/tcjiaan/p/5284713.html