2016년 9월 5일 월요일

네이버 로그인 ASP 버젼 클래스

asp 사이트에서 네이버 로그인 사용 할 일이 생겨서 만들었다.

 

NaverOAuth.asp
<!--#include virtual="/lgdacom/md5.asp" -->
<!--#include virtual="/Class/json2.asp"-->
<%
Class clsNaverOAuth

Private Sub Class_Initialize()
End Sub

private m_clientId
private m_clientSecret
private m_redirectUrl
private m_state
private m_session
private m_code '로그인 인증 요청 API 호출에 성공하고 리턴받은 인증코드값 (authorization code)
private m_refreshToken '갱신 때 필수 - 네이버 사용자 인증에 성공하고 발급받은 갱신 토큰(refresh token)
private m_accessToken '삭제 때 필수 - 기 발급받은 접근 토큰으로 URL 인코딩을 적용한 값을 사용


Public Property Get clientId()
clientId = m_clientId
End Property

Public Property Let clientId(value)
m_clientId = value
End Property


Public Property Get clientSecret()
clientSecret = m_clientSecret
End Property

Public Property Let clientSecret(value)
m_clientSecret = value
End Property


Public Property Get redirectUrl()
redirectUrl = m_redirectUrl
End Property

Public Property Let redirectUrl(value)
m_redirectUrl = value
End Property


Public Property Get state()
state = m_state
End Property

Public Property Let state(value)
m_state = value
End Property


Public Property Get session()
session = m_session
End Property

Public Property Let session(value)
m_session = value
End Property


Public Property Get refreshToken()
refreshToken = m_refreshToken
End Property

Public Property Let refreshToken(value)
m_refreshToken = value
End Property


Public Property Get accessToken()
accessToken = m_accessToken
End Property

Public Property Let accessToken(value)
m_accessToken = value
End Property


Public Property Get code()
code = m_code
End Property

Public Property Let code(value)
m_code = value
End Property

Public Property Get generate_state
Dim rand, mt, state,returnVal
Randomize
rand = Int((999999 * Rnd) + 111111)
mt = Timer
generate_state = md5( mt & rand )
End Property

Public Property Get authQueryString()
authQueryString = "response_type=code"
authQueryString = authQueryString + "&client_id=" + m_clientId
authQueryString = authQueryString + "&redirect_uri=" + Server.URLEncode(m_redirectUrl)
authQueryString = authQueryString + "&state=" + Server.URLEncode(m_state)
End Property

Public Property Get tokenAuthQueryString()
tokenAuthQueryString = "client_id=" + m_clientId
tokenAuthQueryString = tokenAuthQueryString + "&client_secret=" + m_clientSecret
tokenAuthQueryString = tokenAuthQueryString + "&grant_type=authorization_code"
tokenAuthQueryString = tokenAuthQueryString + "&state=" + m_state '발급시
tokenAuthQueryString = tokenAuthQueryString + "&code=" + m_code '발급시
End Property

Public Property Get tokenRefreshQueryString()
tokenRefreshQueryString = "client_id=" + m_clientId
tokenRefreshQueryString = tokenRefreshQueryString + "&client_secret=" + m_clientSecret
tokenRefreshQueryString = tokenRefreshQueryString + "&grant_type=refresh_token"
tokenRefreshQueryString = tokenRefreshQueryString + "&refresh_token=" + m_refreshToken '갱신시
End Property

Public Property Get tokenDeleteQueryString()
tokenDeleteQueryString = "client_id=" + m_clientId
tokenDeleteQueryString = tokenDeleteQueryString + "&client_secret=" + m_clientSecret
tokenDeleteQueryString = tokenDeleteQueryString + "&grant_type=delete"
tokenDeleteQueryString = tokenDeleteQueryString + "&access_token=" + m_accessToken '삭제시
tokenDeleteQueryString = tokenDeleteQueryString + "&service_provider=NAVER" '삭제시
End Property

Public Function httpRequest(url, AuthTkn)
Dim returnDic : Set returnDic = Server.CreateObject("Scripting.Dictionary")
Dim objXMLHTTP : Set objXMLHTTP = server.CreateObject("MSXML2.ServerXMLHTTP")
objXMLHTTP.setOption 2,13056 'ignore SSL errors
objXMLHTTP.Open "POST", url, false
If AuthTkn = "" Then
objXMLHTTP.setRequestHeader "Content-Type", "application/json;charset=UTF-8"
Else
objXMLHTTP.setRequestHeader "Content-Type", "application/xml"
objXMLHTTP.setRequestHeader "Authorization", AuthTkn
End If
objXMLHTTP.Send

If objXMLHTTP.status = 200 Then
'response.write(objXMLHTTP.responseText)
'response.end
Dim jsonstring : jsonstring = objXMLHTTP.responseText
Dim Info : set Info = JSON.parse(join(array(jsonstring)))
Dim key : for each key in Info.enumerate()
returnDic.Add key, Info.get(key)
next
Else
'에러처리
returnDic.Add "error", "status is not 200"
End if

Set httpRequest = returnDic
End Function
End Class

%>

인클루드 파일 설명
md5.asp
stat 값을 생성할 때, asp 자체적으로는 md5 기능이 없어서 추가 했다.
네이버로그인 예제에 해당 기능을 사용하는 데 asp 는 그런 기능이 없다.

해당 사이트가 기존에 사용하고 있는 부분이여서
넣긴 했는데, md5 기능을 빼고 랜덤 함수만 사용하여도
크게 문제는 없을 것 같긴하다.

꼭 사용하려면 asp md5로 검색하면 역시 소스가 잘 나오기 때문에
추가하는데는 어렵지 않을 것이다.

 

json2.asp
네이버 리턴값을 json 으로 주기 때문에 넣어야 한다.
역시 asp 자체적으로 json 파싱기능이 없기 때문이다.

 

사용법
<%@Language="VbScript"%>

<!--#include virtual="/Class/NaverOAuth.asp"-->
<%
Dim NAVER_CLIENT_ID : NAVER_CLIENT_ID = "네이버클라이언트ID"
Dim NAVER_SECRET_KEY : NAVER_SECRET_KEY = "네이버비밀키"
Dim NAVER_REDIRECT_PC_URL : NAVER_REDIRECT_PC_URL = "http://mysite.com/oauth/naver/callback.asp"
Dim NAVER_REDIRECT_MOB_URL : NAVER_REDIRECT_MOB_URL = "http://m.mysite.com/naverLogin/callback.asp"
Dim NAVER_OAUTH_AUTHORIZE_URL : NAVER_OAUTH_AUTHORIZE_URL = "https://nid.naver.com/oauth2.0/authorize"
Dim NAVER_OAUTH_TOKEN_URL : NAVER_OAUTH_TOKEN_URL = "https://nid.naver.com/oauth2.0/token"
Dim NAVER_GET_USER_INFO_URL : NAVER_GET_USER_INFO_URL = "https://openapi.naver.com/v1/nid/me"


Dim clsOAuth : Set clsOAuth = new clsNaverOAuth

Session("NAVER_STATE") = clsOAuth.generate_state
clsOAuth.clientId = NAVER_CLIENT_ID
clsOAuth.state = Session("NAVER_STATE")
clsOAuth.redirectUrl = NAVER_REDIRECT_PC_URL
Dim queryString : queryString = clsOAuth.authQueryString

Response.redirect NAVER_OAUTH_AUTHORIZE_URL & "?" & queryString


%>

인클루드 파일 설명
첫번째 소스 내용을 /Class/NaverOAuth.asp 위치에 저장한 것을 불러오는 부분

 

callback.asp
<%@Language="VbScript"%>
<!--#include virtual="/Class/NaverOAuth.asp"-->

<%
Dim NAVER_CLIENT_ID : NAVER_CLIENT_ID = "네이버클라이언트ID"
Dim NAVER_SECRET_KEY : NAVER_SECRET_KEY = "네이버비밀키"
Dim NAVER_REDIRECT_PC_URL : NAVER_REDIRECT_PC_URL = "http://mysite.com/oauth/naver/callback.asp"
Dim NAVER_REDIRECT_MOB_URL : NAVER_REDIRECT_MOB_URL = "http://m.mysite.com/naverLogin/callback.asp"
Dim NAVER_OAUTH_AUTHORIZE_URL : NAVER_OAUTH_AUTHORIZE_URL = "https://nid.naver.com/oauth2.0/authorize"
Dim NAVER_OAUTH_TOKEN_URL : NAVER_OAUTH_TOKEN_URL = "https://nid.naver.com/oauth2.0/token"
Dim NAVER_GET_USER_INFO_URL : NAVER_GET_USER_INFO_URL = "https://openapi.naver.com/v1/nid/me"

Dim clsOAuth : Set clsOAuth = New clsNaverOAuth

Dim state : state = clsCom.CheckisTrim(Request.QueryString("state"))
Dim code : code = clsCom.CheckisTrim(Request.QueryString("code"))
Dim Error : Error = clsCom.CheckisTrim(Request.QueryString("error"))
Dim error_description : error_description = clsCom.CheckisTrim(Request.QueryString("error_description"))

If error <> "" Then
response.write("error")
response.write("<br>")
response.write(error)
response.write("<br>")
response.write(error_description)
response.end
End If

If Session("NAVER_STATE") <> state Then
response.write("인증 실패")
response.write("<br>")
response.write(Session("NAVER_STATE"))
response.write("<br>")
response.write(state)
response.write("<br>")
response.end
End If

'''===전송할 파라미터 지정
clsOAuth.clientId = NAVER_CLIENT_ID
clsOAuth.state = state
clsOAuth.clientSecret = NAVER_SECRET_KEY
clsOAuth.code = code
'Response.write( clsOAuth.tokenAuthQueryString & vbNewline)


Dim respInfo
Dim profileInfo
Dim authToken

'토큰 발급 요청
Set respInfo = clsOAuth.httpRequest(NAVER_OAUTH_TOKEN_URL &"?"& clsOAuth.tokenAuthQueryString,"")

If respInfo.Exists("error")=true Then
response.write("토큰 접속 요청 에러" & "<br>" )
response.write(respInfo.Item("error") & "<br>" )
Else
Session("NAVER_ACCESS_TOKEN") = respInfo.Item("access_token")
Session("NAVER_REFRESH_TOKEN") = respInfo.Item("refresh_token")
response.write(Session("NAVER_ACCESS_TOKEN") & "<br>" )
response.write(Session("NAVER_REFRESH_TOKEN") & "<br>" )
'프로필 정보 조회
authToken = respInfo.Item("token_type") &" "& respInfo.Item("access_token")
Set profileInfo = clsOAuth.httpRequest(NAVER_GET_USER_INFO_URL, authToken)

If profileInfo.Item("resultcode") = 00 Then
Dim key : for each key in profileInfo.Item("response").enumerate()
response.write(key & " : " & profileInfo.Item("response").get(key) & "<br>" )
next
Else
response.write("프로필 조회 요청 에러" & "<br>" )
response.write(profileInfo.Item("resultcode") & "<br>" )
response.write(profileInfo.Item("message") & "<br>" )
End If
End If



'Session 등록이 클래스 안에서 안됨.
'objXMLHTTP.Send 파라미터로 요청 하려고 했으나, 요청이 잘못 됐다는 에러메시지가 계속 나옴.
%>

 

ps. 네이버로그인을 적용하면서 알 게 된 건데, 해당 기능은 OAUTH 2.0 기능을 사용하고
이 프로토콜은 IETF 표준으로 네이버만 사용하는 기술이 아닌 것이다.
페이스북, 트위터, 구글등 OAUTH 2.0 기능으로 로그인 기능을 제공 하고 있다.

ps2. 개발하면서 이상하다고 생각한게 토큰 갱신,삭제 부분이다. 몇몇 샘플 코드를 봐도
토큰 요청만 개발 해 놓고, 갱신, 삭제 부분은 만들어 놓지도 않았다.

이론적으로는 토큰 요청후  일정시간(expires_in )이 지나면 기존의 토큰은 사라지고 토큰 갱신을 해야 한다는 건데, 그렇게 하지 않아도 토큰 요청을 하면 새로운 토큰을 넘겨준다. 그러면 토큰 갱신이 별 의미가 없어 보인다.

또 토큰 삭제 역시 매뉴얼에는 어플리케이션 연동을 해제 할 때라고 나와 있지만 정작 네이버설정의 '외부 사이트 연결관리' 부분에는 연동한 사이트가 그대로 남아있다.

그에 대한 해답은 여기에서 찾았다.

결론은 엑세스 토큰이 문제가 생겼거나, 보안 이슈를 최소화 하기 위해서 인것 같다.

2016년 8월 24일 수요일

크롬 느려지는 이유.

크롬이 갑자기 어마어마하게 느려졌다.

원인은 역시나 인터넷 뱅킹.

그 중에서 '우리은행 보안로그 수집기'란 녀석

삭제하니 잘 된다. 완전 극혐

2016년 8월 5일 금요일

summit 스위치 초기화 방법

퍼온 내용. 출처 : http://lovevirus133.tistory.com/2

---------------------------------------------------------------

summit스위치를 비밀번호 분실 하여 초기화 하는 과정에서 자료를 찾아 보고 테스트 해보았다.

먼저 스위치에 콘솔로 연결 한뒤 전원플로그를 뺀다. 콘솔에서 스페이스바를 누른 상태에서 전원플로그를 다시 삽입한다.
여기서 bootrom → 이란 프롬프트가 나타날때 까지 스페이스바를 누르고 있어야 한다. bootrom →이란 프롬프트가 나타나면 h(help)를 누르면
아래와 같은 메뉴가 나타난다.


수행절차는 아래와 같다.
1. 1(primary code)을 선택한다. 그 후에 k(Erase selecte configuration)선택하여 선택된 configuration을 지운다.
2. 2(secondary code)을 선택한다 그 후에 k(Erase selecte configuration)선택하여 선택된 configuration을 지운다.
3. d(Force default configuration)을 선택한다. 그 후에 f(on board flash)를 선택하여 부팅한다.
이 절차를 마치면 패스워드를 더이상 입력 하지 않아도 된다. 스위치가 리셋 된 후에 login 프롬프트가 나타나면 admin이라고 치고, password 프롬프트가 나타나면
enter 키를 두번 치면 된다. 그럼 admin수준의 권한을 갖게 되고 다시 login과 password를 변경한 후에 저장하면 된다.

---------------------------------------------------------------

위와 같은 방법으로 admin 계정으로 로그인까지는 완료 하였으나, 패스워드 변경 후 save가 안된다. 아래의 에러 발생.
Command not supported in limited mode

네전따 카페에서 찾은 내용.

Ware 장비에서 Limit-mode에 빠지시면 아래 순서대로 해보세요.
1. #clear log static
2. #clear log diag
- These two commands will clear the error entries in the diag and static logs due to which switch is booting in limited mode.
- Now reboot the switch.
- Then to check the reason for the switch going into limited mode, run following command:
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o />
3. #run diag extended
===========================================
4. _enableBusStatsCLI
5. sh log messages hidden-buffer
[출처] summit48si limited 모드에서 빠져나오질 않네요 (네트워크 전문가 따라잡기) |작성자 렝렝

2번까지만 실행하고 리부팅 하니까 정상적으로 저장 됐다.

2016년 7월 29일 금요일

네이버페이 자바스크립트로 비활성화

네이버 페이를 연동시에 상품이 품절 인 경우는 비활성화를 해주어야 한다.


문제는 한개의 페이지가 아니라 옵션을 선택시 품절 여부를 보여 줄 경우 스크립트로 수정하는 방법을 모른다는 것. 네이버에 물어봐도 제대로 답변해 주지 않는다. 그냥 숨김 처리하라고 하는 데, 버튼이 있던 자리가 없어지는 건 아무래도 이상하다.


소스를 보니 가능 할 것 같아서 해 봤더니, 되긴 된다.


<div id="naverPayBtn"></div>
<script type="text/javascript" src="http://test-pay.naver.com/customer/js/naverPayButton.js" charset="UTF-8"></script>
<script type="text/javascript" >
//<![CDATA[
var npBtnOption ={
BUTTON_KEY: "naverPayBtnCertiKey", // 네이버페이에서 제공받은 버튼 인증 키 입력
TYPE: "A", // 버튼 모음 종류 설정
COLOR: 1, // 버튼 모음의 색 설정
COUNT: 2, //버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
ENABLE: "Y", // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
EMBED_ID : "naverPayBtn",
BUY_BUTTON_HANDLER: buy_nc, // 구매하기 버튼 이벤트 Handler 함수 등록, 품절인 경우 not_buy_nc 함수 사용
//BUY_BUTTON_LINK_URL: "", // 링크 주소 (필요한 경우만 사용)
WISHLIST_BUTTON_HANDLER: wishlist_nc, // 찜하기 버튼 이벤트 Handler 함수 등록
//WISHLIST_BUTTON_LINK_URL: "", // 찜하기 팝업 링크 주소
"":""
}
naver.NaverPayButton.apply(npBtnOption);


//버튼기능(네이버페이 구매하기)
function buy_nc() {
...
return false;
}
function wishlist_nc() {
// 네이버페이로 찜 정보를 등록하는 가맹점 페이지 팝업 창 생성.
// 해당 페이지에서 찜 정보 등록 후 네이버페이 찜 페이지로 이동.
...
return false;
}
function not_buy_nc() {
alert("죄송합니다. 네이버페이로 구매가 불가한 상품입니다.");
return false;
}

</script>

 


아래의 코드로  ENABLE 상태를 변경.


	naverPayStatusChange: function(enable,option,btnHandler) {
$("#"+option.EMBED_ID).text("");
option.ENABLE = enable;
option.BUY_BUTTON_HANDLER = btnHandler;
naver.NaverPayButton.apply(npBtnOption);
}


ex) naverPayStatusChange("N",npBtnOption,not_buy_nc);

ps. 사용자가 네이버페이로 결제시 결제 완료, 실패 리턴이 없음. 그냥 보내면 끝이므로 주의

2016년 7월 18일 월요일

[asp] 스트링 변수에서 xml 가져오기

xml 형식은 다음과 같다.
<COLOR COLORCD="79" CODE="09" CODENAME="09 클래식블랙"/><COLOR COLORCD="9366" CODE="92" CODENAME="92 차콜+네이비옥스포드"/><COLOR COLORCD="9367" CODE="93" CODENAME="93 블랙+차콜하운드투스"/>

변수에서 가져오는 방법은 여기에서 확인 하였다.

위와 같이 해서 확인 하면 에러 발생.

XML 문서에서는 최상위 요소 하나만 허용됩니다.

변수 앞뒤로 <root>, </root> 를 붙여서 사용.

 

최종 코드
dim nodeCount, XMLDom,NodeList,theNode,Node, tmp
Set XMLDom = CreateObject("MSXML2.DomDocument.6.0")
XMLDom.async = false
tmp = "<root>"+rs("COLOR_XML")+"</root>"
XMLDom.LoadXML ( tmp )

theNode = "//COLOR"

Set NodeList = XMLDom.SelectNodes(theNode)
nodeCount = XMLDom.SelectNodes(theNode).length

if XMLDom.parseerror = 0 then
Response.Write(nodeCount)
For Each Node in NodeList
response.write(Node.GetAttribute("CODENAME") & "<br>")
Next
else
response.Write("Error Parsing Results")
end if
Set XMLDom = Nothing

2016년 7월 15일 금요일

dns_txt.c:(.text+0x35): undefined reference to `__res_query'

qmail 설치시 에러 발생

gcc -DBIND_8_COMPAT -O2 -o dktest dktest.o -L. -ldomainkeys -lcrypto `cat dns.lib`
./libdomainkeys.a(dns_txt.o): In function `dns_text':
dns_txt.c:(.text+0x35): undefined reference to `__res_query'
dns_txt.c:(.text+0xcf): undefined reference to `__dn_expand'
dns_txt.c:(.text+0x147): undefined reference to `__dn_expand'
collect2: ld returned 1 exit status
해결
yum install bind-libs

2016년 7월 13일 수요일

determining if ip address is already in use for device eth0 centos

determining if ip address is already in use for device eth0

위와 같은 오류가 발생.

아무리 찾아 봐도 원인을 알 수 없다.

ARPCHECK=no 옵션을 주면 에러가 안 난다고 하는데, 왠지 찝찝하다.

해당 옵션이 무엇인지에 대한 설명은 /usr/share/doc/initscripts-9.03.40/sysconfig.txt 에 나와 있다.
    ARPCHECKn=yes|no
If set to 'no', ifup will not try to determine, if requested ip address
is used by other machine in network.
Defaults to 'yes'.

네트워크에 있는 다른 머신에 의해 결정한다는 건데, 이름에서 추측하건데 arp 체크를 통해 서 중복되는 ip를 찾는 것 같다.

근데!!! 중복되는 IP 가 없어~!!!!

arping 을 해 보라는 둥.. tcpdump 를 잡아 보라는 둥.. 전부 해봐도 특별한 이유가 없다..

xenserver로 설치 한 거라서 조금 특별한 원인이 있지 않을 까도 싶다.

결국 그냥 사용하는 걸로..;;

 

참조:https://blog.cles.jp/item/6718




160928 추가.

ip 셋팅이 되어 있는 부분을 command로 다시 설정하면서 꼬이는 것 같다.
ifconfig eth0 down
service network restart

오류가 나는 인터페이스를 다운 시킨 후 네트워크를 재시작하면 없어진다.

원격에서 작업시 매우 주의!!