• 【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,大功告成。

    示例源代码下载

  • 相关阅读:
    ThinkPHP框架被爆任意代码执行漏洞
    thinkphp session 跨域问题解决方案
    网摘地址
    thinkphp的各种内部函数 D()、F()、S()、C()、L()、A()、I()详解
    IP相关(近两天的学习总结)
    ThinkPHP 手册摘录之(跨模块)调用
    c#让程序在WIN7下兼容模式运行
    QT学习之经典控件源码(如此强大)
    C#自定义控件七水波纹
    C#自定义控件五报警按钮
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/5284713.html
Copyright © 2020-2023  润新知