Node.jsలో Google Service Account JWTని రూపొందించడం
చాలా మంది డెవలపర్లు Google APIsని కాల్ చేయడానికి googleapis npm ప్యాకేజీని ఉపయోగిస్తారు. ఇది బాగా పనిచేస్తుంది. కానీ ఇది మీ ప్రాజెక్ట్కు 380KB మరియు 450 కంటే ఎక్కువ dependenciesని జోడిస్తుంది.
మీరు ఒక సాధారణ CI స్క్రిప్ట్ కోసం కేవలం ఒకే ఒక APIని మాత్రమే ఉపయోగించాలనుకుంటే, ఇది అవసరానికి మించి (overkill) ఉంటుంది.
నేను కేవలం మూడు Node.js built-ins: crypto, fetch, మరియు URLలను మాత్రమే ఉపయోగించి URL ఇండెక్స్ స్టేటస్ను తనిఖీ చేయడానికి ఒక స్క్రిప్ట్ను రూపొందించాను. ఇది ఏ బాహ్య (external) ప్యాకేజీలను ఉపయోగించదు.
ఈ authentication RFC 7523ని అనుసరిస్తుంది. దీనిని ఎలా చేయాలో ఇక్కడ ఉంది:
- మీ service account email మరియు private keyని ఉపయోగించి ఒక JWTని సృష్టించండి.
- ఆ JWTని Google token endpointకి POST చేయండి.
- తక్కువ సమయం మాత్రమే పనిచేసే (short-lived) access tokenని పొందండి.
- మీ API రిక్వెస్ట్ల కోసం ఆ tokenని Bearer headerగా ఉపయోగించండి.
JWTకి ఈ క్రింది claims అవసరం:
- iss: మీ client email.
- scope: webmasters.readonly.
- aud: Google token URL.
- iat: ప్రస్తుత సమయం (current time).
- exp: ప్రస్తుత సమయం + 3600 సెకన్లు.
గమనిక: webmasters scopeని ఉపయోగించండి. కొత్త searchconsole scope, URL Inspection API కోసం పనిచేయదు.
కష్టమైన భాగం Base64url encoding. దీనిని అనుకూలంగా (compatible) మార్చడానికి మీరు paddingని తొలగించి, అక్షరాలను మార్చాలి. మీ RSA private keyతో JWTని సైన్ చేయడానికి మీరు node:crypto మాడ్యూల్ని ఉపయోగించవచ్చు. మీ Google Cloud JSON ఫైల్లోని కీ నేరుగా పనిచేస్తుంది.
మీరు tokenను ఎక్స్ఛేంజ్ చేసినప్పుడు, raw error responseని log చేయండి. Google "Service account not found" వంటి నిర్దిష్ట సందేశాలను అందిస్తుంది. ఇది తప్పులను (errors) వేగంగా సరిదిద్దడానికి మీకు సహాయపడుతుంది.
ఈ విధానం ఈ క్రింది సందర్భాలలో ఉత్తమంగా పనిచేస్తుంది:
- మీరు CI pipelineలో ఒకే ఒక APIని ఉపయోగిస్తున్నప్పుడు.
- మీ repoని తేలికగా (light) ఉంచాలనుకున్నప్పుడు.
- మీరు auth flowని అర్థం చేసుకోవాలనుకున్నప్పుడు.
ఈ క్రింది సందర్భాలలో దీనిని ఉపయోగించవద్దు:
- మీరు చాలా రకాల Google APIsని కాల్ చేస్తున్నప్పుడు.
- మీకు ఆటోమేటిక్ token refreshing అవసరమైనప్పుడు.
- మీరు ఒక పెద్ద production serverని నిర్మిస్తున్నప్పుడు.
పరిమితమైన పనుల కోసం వందలాది దాగి ఉన్న (hidden) dependencies కంటే, చిన్నదిగా మరియు చదవగలిగే (readable) కోడ్ ఉత్తమం.