애플 릿 개발 실현 accesstoken 통합 관리

TOKEN 타이머
배경
공공 플랫폼 의 API 기능 을 사용 한 개발 자 에 게 accesstoken 은 절대 낯 설 지 않 습 니 다.마치 집 문 을 여 는 열쇠 처럼 들 고 있 으 면 대중 플랫폼 의 대부분 API 기능 을 사용 할 수 있 습 니 다.따라서 개발 자 에 게 accesstoken 의 사용 방식 은 특히 중요 하 다.일상적인 API 인터페이스 운영 에서 왜 나의 access토 큰 이 갑자기 불법 이 야?왜 방금 받 은 accesstoken,10min 쓰 고 기한 이 지 났 어 요?이러한 의문 에 대하 여 우 리 는 access 를 제공 합 니 다.token 의 디자인 방안 은 개발 자가 accesstoken 사용 방식 에 대한 이해.
access 에 대하 여token 의 획득 은 공공 플랫폼 의 공식 문 서 를 참고 할 수 있 습 니 다.auth.getAccessToken,액세스 토 큰 가 져 오기
2.accesstoken 의 내부 디자인
2.1 access_token 의 실효 성
알다 시 피 accesstoken 은 appid 와 appsicret 를 통 해 생 성 됩 니 다.내부 설계 의 절 차 는 다음 과 같다.
(1)개발 자가 https 요청 방식:GEThttps://API.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET를 통 해 appid 및 appsecret 의 인 자 를 입력 합 니 다.
(2)공공 플랫폼 배경 에서 appid 와 해시(appsicret)가 저장 소 와 일치 하 는 지 확인 합 니 다.일치 하면 현재 시간 스탬프 와 결합 하여 새로운 access 를 생 성 합 니 다.token。
(3)새로운 access 생 성token 과 동시에 오래된 accesstoken 의 만 료 시간 스탬프 는 현재 시간 스탬프 로 업 데 이 트 됩 니 다.
(4)새로운 access 로 돌아 가기개발 자
여기 서 그림 의 방식 으로 신 구 token 교체 과정 을 설명 합 니 다.

위의 그림 에서 주의해 야 할 몇 가지 점:
(1)공공 플랫폼 저장 층 은 신 구 두 access 만 저장 합 니 다.token 은 개발 자가 3 번 의 인 터 페 이 스 를 중복 호출 한다 고 가정 하면 최초의 accesstoken 은 즉시 효력 을 상실 합 니 다.
(2)새로운 access 를 요청 하지만token 후,오래된 accesstoken 만 료 시간 은 현재 시간 으로 업데이트 되 지만 즉시 효력 을 잃 지 않 습 니 다.원 리 는[2.2 access 를 참고 하 십시오.token 의 점차 실효 성]
(3)정보 안전 을 고려 하여 공공 플랫폼 은 appcret 를 명문 으로 저장 하지 않 고 appid 와 appcret 의 해시 값 만 저장 합 니 다.따라서 개발 자 는 앱 시 크 릿 을 잘 보관 해 야 한다.앱 시 크 릿 이 유출 된 것 으로 의심 되 는 경우,즉시 mp.weixin.qq.com 에 로그 인하 여 앱 시 크 릿 을 리 셋 해 야 합 니 다.
2.2 access_token 의 점진 적 실효 성
부터[accesstoken 의 실효 성]알 겠 습 니 다.개발 자가 새로운 access 를 요청 할 때token 시,오래된 accesstoken 만 료 시간 은 현재 시간 으로 업데이트 되 지만 이 때 는 즉시 효력 을 잃 지 않 습 니 다.왜냐하면 공공 플랫폼 은[5 분 의 신 구 access 를 제공 하기 때 문 입 니 다.token 교체 버퍼 시간],그래서 access 라 고도 합 니 다.token
의 점차 실효 성.
실현 의 원 리 는:
  • 늙 은 access 때문에token 만 료 시간 스탬프 가 새로 고침 되 었 기 때문에 API 인터페이스 요청 기간 에 가 져 온 accesstoken 이 풀 리 면 만 료 시간 스탬프 에 5 분 을 더 한 다음 현재 장치 시간 과 비교 합 니 다.현재 장치 시간 을 초과 하면 실효 로 판단 합 니 다.
  • 공공 플랫폼 의 설 비 는 시계 동기 화 를 유지 하지만 설비 간 에 1-2 분 의 시간 차이 가 존재 할 수 있 기 때문에[5 분]절대적 인 시간 값 이 아니다.개발 자가 새로운 access 를 가 져 올 때token 후 가능 한 한 빨리 새로운 access 로 전환 해 야 합 니 다.token。

  • 위의 그림 에서 주의해 야 할 몇 가지 점:
    (1)장치 시간 동기 화 차이 가 존재 하기 때문에 개발 자가 오래된 access 를 가지 고 있 을 수 있 습 니 다.token 은 API 인 터 페 이 스 를 요청 합 니 다.일부 요청 이 성공 하고 일부 요청 이 실패 한 경우 개발 자 에 게 새로운 access 를 가 져 오 는 것 을 권장 합 니 다.token 후 가능 한 한 빨리 사용 하 세 요.
    (2)두 개의 그림 을 이해 함으로써 개발 자 에 게 accesstoken 은 상당히 관건 적 이 고 함부로 조절 할 수 없 는 인터페이스 입 니 다.개발 자 에 게 access 를 통일 적 으로 관리 하 는 것 을 권장 합 니 다.token,여러 번 요청 으로 accesstoken 실효.
    3.accesstoken 의 통일 관리access_token의 업 데 이 트 를 정시 트리거 에 맡 겨 사용access_token의 인터페이스 호출 을 완료 하고 전송 되 지 않 습 니 다access_token.백 엔 드 에 맡 겨 데이터베이스 에서 읽 습 니 다.
    다음은 애플 릿 클 라 우 드 함수 단 통일 관리access_token코드 를 예 로 들 어 보 여 줍 니 다.
    index.js 요청 및 업데이트access_token다른 쪽 에 있 으 면 들 어 와 야 합 니 다APPID
    
    const cloud = require('wx-server-sdk')
    cloud.init({
      env: cloud.DYNAMIC_CURRENT_ENV
    })
    const timeutil = require('./timeutil');
    //         
    const APPSECRET =  ''
    const axios = require('axios');
    const db = cloud.database();
    //           
    const CONFIG = 'cloud-token';
    //   TOKEN
    const URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}'
    function getAccessToken(APPID,APPSECRET){
      let url = URL;
      url = url.replace('{APPID}',APPID)
      url = url.replace('{APPSECRET}',APPSECRET)
      return new Promise(function(resolve,reject){
        axios.get(url).then(function (response) {
          console.log(response);
          resolve(response)
        })
        .catch(function (error) {
          console.log(error);
          reject(error)
        });
      })
    }
    //        
    exports.main = async (event, context) => {
      const wxContext = cloud.getWXContext()
      //         APPID
      var APPID = wxContext.APPID;
      return new Promise(function(resolve,reject){
        getAccessToken(APPID,APPSECRET).then(async res=>{
          console.log(res)
          let access_token = res.data.access_token;
          let ans =  await db.collection(CONFIG).doc('access_token').set({
            data:{
              value:access_token,
              _updateTime:timeutil.TimeCode()
            }
          })
          resolve(ans)
        })
      }) 
    }
    config.json 정시 트리거
    시간 당 한번 촉발
    
    {
      "triggers": [
        {
          "name": "myTrigger",
          "type": "timer",
          "config": "0 0 * * * * *"
        }
      ]
    }
    
    timeutil.js 시간 도구 클래스
    
    function TimeCode() {
      var date = new Date();
      var year = date.getFullYear()
      var month = date.getMonth() + 1
      var day = date.getDate()
    
      var hour = date.getHours()
      var minute = date.getMinutes()
      var second = date.getSeconds()
    
      return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
    }
    //    
    function _formatTime(time) {
      var date = time.getFullYear() + ' ' + time.getMonth() + ' ' + time.getDate() + ' '
      var ftime = time.getHours() + ' ' + time.getMinutes() + ' ' + time.getSeconds() + ' '
      return date + ftime;
    }
    function TimeCodeYmd(){
      var date = new Date();
      var year = date.getFullYear()
      var month = date.getMonth() + 1
      var day = date.getDate()
    
      return [year, month, day].map(formatNumber).join('-');
    }
    function formatNumber(n) {
      n = n.toString()
      return n[1] ? n : '0' + n
    }
    module.exports={
      TimeCode,
      TimeCodeYmd
    }
    
    다른 클 라 우 드 함수 에서access_token에 사용 되 는 곳 은 데이터 베 이 스 를 조회 하여 얻 을 수 있 고 이들 은 데이터 베 이 스 를 통 해 논리 적 결합 을 할 수 있 습 니 다.
    access_token 조회 사용
    
    const TOKEN = 'cloud-token';
    //  access_token 
      try {
        let tres = await db.collection(TOKEN).doc('access_token').get();
        access_token = tres.data.value;
        console.log(access_token)
      } catch (error) {
        console.log('-- token  --')
        return {
          errCode:-1,
          errMsg:'     TOKEN  '
        }
      }
    
    참고 문서
    【1】 공용 플랫폼/애플 릿 서버 API 의 accesstoken 의 내부 디자인|위 챗 오픈 커 뮤 니 티(qq.com)
    【2】 auth.getAccessToken|위 챗 오픈 문서(qq.com)
    【3】 위 챗 애플 릿 개발 기법 총화(3)-클 라 우 드 개발 시효 데이터 리 셋 및 저장(accesstoken 등)-Kindear-블 로그 원(cnblogs.com)
    애플 릿 개발 실현 accesstoken 통일 관리 글 은 여기까지 입 니 다.더 많은 애플 릿 accesstoken 통합 관리 콘 텐 츠 는 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기