美文网首页Android 知识C#C#
白话 Oauth 的授权流程

白话 Oauth 的授权流程

作者: 天兵公园 | 来源:发表于2017-07-24 18:10 被阅读95次

    博主的公司项目是从头开始的,所以任何第三方账户接入都是博主自己开发。因为存在一些特殊需求,所有官方提供的第三方登录 sdk 或多或少都不能满足。

    搜索了一下网上关于 oAuth 相关的教程都鱼龙混杂,大多是官方 sdk 是如何使用,导致我知其然不知其所以然,接入了一个网站之后就不知道如何接入另一个网站了,特别有的没有提供 .net 的 SDK,这就很尴尬了。

    下面简单谈谈 oAuth 授权和获取用户信息的流程供大家参考。

    首先说说 QQ 的授权,疼迅给的一个流程图,它也引用 oAuth 协议草案的:

    oauth 授权流程

    说实话,我一开始根本就看不懂,尴尬。

    事实上落地代码流程是这样,暴力绘画技能,将就看:

    oauth 授权流程暴力版

    接下来用 ASP.NET MVC 实现以下,新建一个控制器 AuthController,在这个控制器里创建一个名为 QQ 的 Action:

    public ActionResult QQ()
    {
        string code = Request.QueryString["code"] + "";
        if (code.Length < 3)
        {
            
            string redirectParas = string.Format("?response_type={0}&client_id={1}&redirect_uri={2}&state={3}&scope={4}",
                "code",
                你的ClientID,
                回调地址(可以使当前Action),
                在回调时希望服务器传回的值可以放在state参数中,
                "get_user_info");
            string url = "https://graph.qq.com/oauth2.0/authorize" + redirectParas;
            Response.Redirect(url);
        }
        else
        {
            GetAuthToken(code);
        }
        return View();
    }
    

    当用户首次访问这个控制器时(此时 code 参数为空),就把用户领到 QQ 的授权页,让用户登录。用户登录后就会返回 Authorization Code ,服务器会重新将浏览器重定向到新的地址并携带 code 参数,这个新的地址就是回调地址,通常我习惯把当前的控制器的 Action 路径作为回调地址,所以此处判断 code 参数长度,当 code 参数不为空时,就去获取 Access Token。

    private string GetAuthToken(string code)
    {
        string url = "https://graph.qq.com/oauth2.0/token";
        string redirectParas = string.Format("?grant_type={0}&client_id={1}&client_secret={2}&code={3}&redirect_uri={4}",
            "authorization_code",
            你的client id,
            你的client secret,
            刚拿到的Authorization Code ,
            回调地址);
    
        string access_token = "";
    
        // TODO 获取 token
        
        return access_token;
    }
    

    获取 Access Token 时,要把 Client Id、Client Secret、和 Authorization Code都拿上,这好比在去机关单位办个事,带上你的身份证去机关登记后给你开个受理登记证,你拿着受理登记证去街道办事处盖个章和街道证明和你全家户口本房产证结婚证再去机关,机关又给你个受理确认证明,你拿着受理确认证明再去机关的窗口排队办事。

    这个获取 token 我写了个 TODO,因为有的三方接口需要 POST 访问,有的可以 GET访问,就好比这个受理确认证明,有的机关就是比较难拿一些,一个道理。

    拿到了 access token 之后,就可以调用三方接口文档上的 API了,获取用户信息也就小 case 了。需要注意的是,大部分三方接口的 access token 都是有有效期的,不过大都会提供 refresh token 的 接口,让你用老 token 换新 token,这个啊,和在武汉重新续签居住证一个样。

    知道这个原理和流程,基本随便改改就能兼容微博和任何的第三方的登录了,假如我要接入一个国外的户外骑行运动数据分析网站 Strava:

    第一步:首先去开发者中心申请一个应用,网站就会分配一个 client id

    第二步:重定向用户到指定的 API 地址上获取 Authorization Code(基本都简称 code),比如:https://www.strava.com/oauth/authorize?client_id=你的ClientID&response_type=code&redirect_uri=你的回调地址&state=&scope=view_private,write&approval_prompt=force ,将用户导航到这个地址后,基本会出现一个用户登录窗口,用户授权登录后,就会跳转到我们指定的回调地址,同时会携带参数 code,也就是 Authorization Code,我们只需要在回调地址的处理程序中接口保管好 code 即可,因为获取 access token 时需要。

    第三步:获取 access token,通常这一步需要所有的参数,提供方分配的 id secret 和刚才的 code,而且这一步大部分是程序内(你的服务器)的 http post 访问,所以如何用户能访问 oauth 提供方,而你的服务器不能,那这一步就悲剧了。这个 post 的结果不尽相同,有的是 json 有的不是,对返回值稍作处理都能大脑这个 access token 和它的过期时间。

    第四步:这一步基本完了,你能使用 access token 访问 API 提供方的大部分接口了,当然收费接口除外。

    综上的废话,oauth 接入,只需这四个步骤,申请 client id & client secret -> 拿 client id 换 code ** ->** 拿 code & client id & client secret 换 access token ** ->** 拿 access token 访问 API接口。

    此文依旧同步发布在 简书 微信天兵公园公众号 以及 博客,如需转载,请事先联系。

    多多关注哟

    相关文章

      网友评论

        本文标题:白话 Oauth 的授权流程

        本文链接:https://www.haomeiwen.com/subject/tfbbkxtx.html