成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

nodejs實(shí)現(xiàn)微信授權(quán)

longmon / 3429人閱讀

摘要:背景項(xiàng)目基于開(kāi)發(fā)服務(wù)器用,提供微信授權(quán)和跨域使用微信獲取經(jīng)緯度,再利用百度地圖獲取用戶所在城市待優(yōu)化問(wèn)題項(xiàng)目的微信授權(quán)基于老的項(xiàng)目,寫的有點(diǎn)不夠優(yōu)雅自己開(kāi)發(fā)時(shí)把授權(quán)信息存到了里面,導(dǎo)致每次進(jìn)入項(xiàng)目都要走一遍授權(quán),浪費(fèi)時(shí)間和影響用戶體驗(yàn)解決方

背景
項(xiàng)目基于angular1.3開(kāi)發(fā)
web服務(wù)器用node,提供微信授權(quán)和跨域
使用微信jssdk獲取經(jīng)緯度,再利用百度地圖API獲取用戶所在城市

待優(yōu)化問(wèn)題:
項(xiàng)目的微信授權(quán)基于老的項(xiàng)目,寫的有點(diǎn)不夠優(yōu)雅;
自己開(kāi)發(fā)時(shí)把授權(quán)信息存到了sessionStorage里面,導(dǎo)致每次進(jìn)入項(xiàng)目都要走一遍授權(quán),浪費(fèi)時(shí)間和影響用戶體驗(yàn);

解決方案:
重寫授權(quán),讓項(xiàng)目初始化時(shí)只請(qǐng)求一個(gè)接口,就可以拿到用戶的基本信息;將獲取的用戶基本信息存在cookie里面,并設(shè)置一個(gè)比較長(zhǎng)的過(guò)期時(shí)間,以便用戶在某一段時(shí)間內(nèi)訪問(wèn)可以不用再次授權(quán),拿微信授權(quán)的相關(guān)代碼就貼在下面了.

服務(wù)端用node+express

路由部分

router.js
/**
 * router
 */
const express = require("express");
const router = express.Router();
const wxAuth = require("../wxAuth.js");
router.get("/auth", wxAuth.getCode, (req, res, next) => {
    // 授權(quán)調(diào)用
});
router.get("/wxAuth/getUserInfo", wxAuth.getAccessToken, wxAuth.getUserInfo, (req, res, next) => {
    let back_url = req.query.back_url;
    console.log("back_url=="+back_url);
    if (back_url.indexOf("?path=")) {
        back_url = back_url.replace("?path=","#/")
        console.log(back_url);
    }
    res.redirect(back_url);
});
module.exports = router;

授權(quán)中間件 wxAuth.js
//微信公眾號(hào)的appId和appSecret配置文件
const weixin = require("../weixin.config.js")

const request = require("request")
const appId = weixin.appID;
const appSecret = weixin.appsecret;
const Host = "http://example.com"
exports.getCode = (req, res, next) => {
    if (req.cookies && req.cookies.openid) {
        next();
    } else {
        console.log(req)
        let back_url = escape(req.query.back_url);
        console.log(req.query.back_url)
        let redirect_url = `http://mall.yizhenjia.com/wxAuth/getUserInfo?back_url=${back_url}`;
        let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_url}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect `;
        console.log(url);
        res.redirect(url);
    }
}
exports.getAccessToken = (req, res, next) => {
    console.log("====accessToken")
    // console.log(req.query)
    let code = req.query.code;
    let url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appId}&secret=${appSecret}&code=${code}&grant_type=authorization_code `;
    request(url, (error, response, body) => {
        let result = JSON.parse(body);
        console.log(result)
        req.access_token = result.access_token;
        req.openid = result.openid;
        next();
    });
}
exports.getUserInfo = (req, res, next) => {
    console.log("====getUserInfo")
    let access_token = req.access_token;
    let openid = req.openid;
    let url = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}&lang=zh_CN `
    request(url, (error, response, body) => {
        console.log(body)
        let result = JSON.parse(body);
        res.cookie("openid", result.openid, { maxAge: 24 * 60 * 60 * 1000, httpOnly: false });
        res.cookie("unionid", result.unionid, { maxAge: 24 * 60 * 60 * 1000, httpOnly: false });
        res.cookie("nickname", result.nickname, { maxAge: 24 * 60 * 60 * 1000, httpOnly: false });
        res.cookie("headimgurl", result.headimgurl, { maxAge: 24 * 60 * 60 * 1000, httpOnly: false });
        next();
    });
}

在angular項(xiàng)目啟動(dòng)的時(shí)候,就判斷有沒(méi)有用戶union的cookie存在,如果不存在就去授權(quán),并阻止視圖渲染

獲取授權(quán),因?yàn)槲⑿攀跈?quán)的時(shí)候,會(huì)忽略angular路由的哈希值后面的內(nèi)容,所以把哈希值做了轉(zhuǎn)換,在服務(wù)端的router.js里面,又把哈希值還原,在重定向的時(shí)候?qū)懺趗rl里

//放在commonUtil服務(wù)里面
轉(zhuǎn)換url,將路由參數(shù)傳給服務(wù)器,然后在授權(quán)結(jié)束后,在重定向的url里獲取路由的哈希值(這里的哈希處理更多的是為了后面微信支付路徑的問(wèn)題)
self.getAuth = function() {
    var hash = window.location.hash.replace("#/", "?path=");
    var origin = window.location.origin;
    var pathname = window.location.pathname;
    var bcakUrl = origin + pathname + hash;
    window.location.href = "/auth?back_url=" + bcakUrl;
}
 

判斷授權(quán),沒(méi)有授權(quán)情況下阻止默認(rèn)渲染,并請(qǐng)求授權(quán)(在其他框架的時(shí)候也可以做類似處理)
 
 $rootScope.$on("$stateChangeStart", function(event) {
   if (!cookieUtil.hasCookie("unionid") || !cookieUtil.hasCookie("openid")) {
      commonUtil.getAuth();
      event.preventDefault();
     }
 });
 //cookieUtil判斷cookie是否存在,設(shè)置cookie和獲取cookie值(angular service)

授權(quán)源碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90232.html

相關(guān)文章

  • 2018微博詞云項(xiàng)目深度解析

    摘要:最初產(chǎn)生這個(gè)項(xiàng)目的想法應(yīng)該是在年月份,當(dāng)時(shí)正在學(xué)習(xí)中,就萌生了這樣一個(gè)想法從一個(gè)用戶這一年發(fā)布的微博數(shù)據(jù)中,提取最有意義的個(gè)關(guān)鍵詞。這些東西提交完就可以提交審核了,微博應(yīng)用審核的速度還算比較快的,一兩天基本差不多會(huì)審核完。 最初產(chǎn)生這個(gè)項(xiàng)目的想法應(yīng)該是在2018年10月份,當(dāng)時(shí)正在學(xué)習(xí)python中,就萌生了這樣一個(gè)想法:從一個(gè)用戶這一年發(fā)布的微博數(shù)據(jù)中,提取最有意義的top50個(gè)關(guān)鍵...

    TANKING 評(píng)論0 收藏0
  • nodejs微信開(kāi)發(fā)---接入指南

    摘要:內(nèi)網(wǎng)穿透由于微信開(kāi)發(fā)的端口必須是最近貌似增加了,所以一個(gè)內(nèi)網(wǎng)穿透工具還是很有必要的。我個(gè)人使用的是瀏覽器微信調(diào)試工具。若確認(rèn)此次請(qǐng)求來(lái)自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷貐?shù)內(nèi)容,則接入生效,成為開(kāi)發(fā)者成功,否則接入失敗。 首先github地址奉上:https://github.com/xiadd/shorthand 歡迎star?最近又拾起了微信開(kāi)發(fā),之前的公眾號(hào)是用的flask進(jìn)行開(kāi)發(fā)的,所以...

    LiangJ 評(píng)論0 收藏0
  • Fiddler助力微信開(kāi)發(fā)調(diào)試

    摘要:下面介紹在微信開(kāi)發(fā)調(diào)試方面的應(yīng)用。微信網(wǎng)頁(yè)開(kāi)發(fā)中,由于有接口安全域名和授權(quán)域名等的限制,導(dǎo)致部分功能需要部署到線上才能測(cè)試。設(shè)置代理服務(wù)器打開(kāi)微信開(kāi)發(fā)者工具,設(shè)置代理設(shè)置選擇手動(dòng)設(shè)置代理。 Fiddler是一個(gè)非常強(qiáng)大的代理工具,可以讓你的前端開(kāi)發(fā)調(diào)試更加方便。下面介紹在微信開(kāi)發(fā)調(diào)試方面的應(yīng)用。 微信網(wǎng)頁(yè)開(kāi)發(fā)中,由于有js接口安全域名和授權(quán)域名等的限制,導(dǎo)致部分功能需要部署到線上才能測(cè)...

    mengera88 評(píng)論0 收藏0
  • 微信公眾號(hào)開(kāi)發(fā)

    摘要:接口安全域名主要是在調(diào)用微信時(shí)用到。到這里為止測(cè)試號(hào)配置就完成了二微信網(wǎng)頁(yè)授權(quán)篇接口地址為這里你可以使用此地址上的接口進(jìn)行自己編寫,也可以使用別人封裝好的。 說(shuō)明:由于最近開(kāi)發(fā)公眾號(hào),特寫篇文章來(lái)記錄下開(kāi)發(fā)流程和開(kāi)發(fā)中的坑。開(kāi)發(fā)用的技術(shù)為 react + express , nodejs作為中間層。 一.配置篇 首先申請(qǐng)接口測(cè)試號(hào)地址:https://mp.weixin.qq.com/...

    nifhlheimr 評(píng)論0 收藏0
  • 登錄那些事兒

    摘要:假如是在同一個(gè)域名下,例如與,因?yàn)樵试S設(shè)置到二級(jí)域名下,所以和是可以共享的,用戶的信息可以通過(guò)可逆加密放在二級(jí)域名下的,并且設(shè)置,就可以一站登錄,站站登錄。 原文鏈接:BlueSun | 登錄那些事兒 也不知道是什么原因,剛開(kāi)始不久的職業(yè)生涯,在技術(shù)這條路走著走著,和「登錄」總是有著一個(gè)不解之緣。還記得當(dāng)初學(xué)習(xí)Web編程的時(shí)候么?不管是Java、.Net、PHP,繼經(jīng)典「Hello W...

    layman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<