Skip to content

Latest commit

 

History

History
105 lines (101 loc) · 4.26 KB

auth-simple.md

File metadata and controls

105 lines (101 loc) · 4.26 KB

本示例可用于h5类型的dapp接入有令开放平台的授权登录功能,仅供参考。
主要步骤如下:
第一步:检查url里面有没有code参数
第二步:有code参数则认为用户已经授权,可以直接使用code去开放平台换access_token(调用https://dev-open.youchainapi.com/oauth2/access_token接口)
第三步:若无code参数,则需要先进行授权,那么执行跳转到https://dev-open.youchainapi.com/connect/oauth2/authorize,以唤醒有令app授权页面, 用户点击授权后有令app会在回调地址url后面追加上code参数并打开该回调地址页面。重新执行第一步操作

注意:code仅有5分钟有效期且只能使用一次,获得code之后请立即使用code换取access_token和openid

假如dapp开户时配置的回调地址是 https://front.youchain.com/game/index.html,
dapp后台使用code换取access_token的接口是 https://backend.youchain.com/game/code.do
那么index.html内有js代码如下:

    var appid = "yc792344e039b583096cd6f84e1a8d8cb0";
    init();
    function init() {
        var js = urljson();  // 解析url里面的参数
        if (typeof js != "undefined") {
            if (typeof js.code != "undefined" && js.code) { // 认为已授权
                beginGame(js.code);
            } else { // 需要先进行授权登录操作
                toAuthLogin(); 
            }
        }
    }
    function toAuthLogin() {
        var uri = encodeURIComponent("https://front.youchain.com/game/index.html").toLowerCase();
        var link = "https://dev-open.youchainapi.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + uri 
                        + "&response_type=code&scope=snsapi_userinfo&state=STATE";
        window.location.href = link;
    }
    function beginGame(code) {
        $.ajax({
            type: "GET",
            url: "https://backend.youchain.com/game/code.do",
            data: "appid=" + appid + "&code=" + code,
            success: function(data){
                // 此处处理游戏逻辑
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                // 状态码
                console.log(XMLHttpRequest.status);
                // 状态
                console.log(XMLHttpRequest.readyState);
                // 错误信息
                console.log(textStatus);
            }
        });
    }
    function urljson() {
        var url = window.location.href;
        if(url.indexOf('?')!=-1){
            url=url.substring(url.indexOf('?')+1,url.split("").length);
            var str="{\"";
            var ch=url.split("");
            var size=ch.length;
            var gogo=true;
            for(var i=0;i<size;i++){
                if(gogo){
                    if(ch[i]=='='){
                        gogo=false;
                        str+="\":\"";
                    }else{
                        str+=ch[i];
                    }
                }else{
                    if(ch[i]=='&'){
                        gogo=true;
                        str+="\",\"";
                    }else{
                        str+=ch[i];
                    }
                }
            }
            str+="\"}";
            return JSON.parse(str);
        }else{
            return undefined;
        }
    }

服务端:https://backend.youchain.com/game/code.do代码如下:

    @RestController
    public class IndexController {
        @GetMapping("/game/code.do")
        public String code(@RequestParam String appid, @RequestParam String code) {
            String url = "https://dev-open.youchainapi.com/oauth2/access_token";
            String appSecret = "xxxx"; // 开通app时的appSecret
            Map<String, Object> params = new HashMap<>();
            params.put("appid", appid);
            params.put("code", code);
            params.put("secret", appSecret);
            params.put("grant_type", "authorization_code");
            String result = HttpUtil.get(url, params);
            Map<String, Object> resultMap = JsonUtil.toMap(result);
            String accessToken = (String) resultMap.get("access_token");
            String openId = (String) resultMap.get("openid");
            // TODO 处理自己的业务
            return result;
        }
    }