동기화 게이트웨이 API를 사용하면 클라이언트 측에서 특정 사용자로 인증하여 이 사용자가 액세스할 수 있는 데이터를 복제할 수 있습니다. 기본 인증의 경우, 사용자가 이미 동기화 게이트웨이 데이터베이스에 존재해야 합니다. 사용자를 만드는 방법에는 두 가지가 있습니다:
- 아래의 구성 파일에서
사용자
필드에 입력합니다. - 관리자 REST API에서.
관리자 포트(4985)는 공개적으로 액세스할 수 없으므로 로그인 및 가입 화면을 제공하려면 사용자 생성을 처리하는 앱 서버를 적절히 설정해야 합니다. 이 튜토리얼에서는 그 방법을 배웁니다:
- 관리자 REST API를 사용하여 사용자를 만듭니다.
- 사용자를 관리하기 위해 Node.js로 앱 서버를 설정합니다.
- 샘플 안드로이드 앱에서 로그인 및 가입 화면을 디자인하여 앱 서버를 테스트합니다.
시작하기
동기화 게이트웨이를 다운로드하고 파일의 압축을 풉니다:
http://www.couchbase.com/nosql-databases/downloads#Couchbase_Mobile
이 튜토리얼에서는 구성 파일이 필요하지 않습니다. 기본 구성 속성의 경우 명령줄 옵션을 사용할 수 있습니다. 실행할 바이너리는 ~/Downloads/couchbase-sync-gateway/bin/
. 를 사용하여 프로그램을 실행하십시오. --help
플래그를 선택하면 사용 가능한 옵션 목록을 볼 수 있습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
~/다운로드/카우치베이스-동기화-게이트웨이/bin/동기화 게이트웨이 --도움말 사용법 의 /사용자/제임스 노센티니/다운로드/카우치베이스-동기화-게이트웨이/bin/동기화 게이트웨이: -관리자 인터페이스="127.0.0.1:4985": 주소 에 바인드 관리자 인터페이스 에 -버킷="sync_gateway": 이름 의 버킷 -configServer="": URL 의 서버 그 can 반환 데이터베이스 configs -dbname="": 이름 의 카우치베이스 서버 데이터베이스 (기본값 에 이름 의 버킷) -배포ID="": 고객/프로젝트 식별자 에 대한 통계 보고 -인터페이스=":4984": 주소 에 바인드 에 -로그="": 로그 키워드, 쉼표 분리 -로그파일경로="": 경로 에 로그 파일 -페르소나오리진="": 기본 URL 그 클라이언트 사용 에 연결 에 의 서버 -pool="default": 이름 의 pool -예쁜=false: 예쁘다-인쇄 JSON 응답 -프로필 인터페이스="": 주소 에 바인드 프로필 인터페이스 에 -URL="월러스:": 주소 의 카우치베이스 서버 -verbose=false: 로그 더 보기 정보 약 요청 |
이 튜토리얼에서는 dbname
, 인터페이스
, 예쁜
그리고 URL
:
1 |
~/다운로드/카우치베이스-동기화-게이트웨이/bin/동기화 게이트웨이 -dbname="스마트홈" -인터페이스="0.0.0.0:4984" -예쁜="true" -URL="월러스:" |
사용자를 만들려면 터미널에서 다음을 실행하면 됩니다:
1 2 3 |
$ curl -vX POST -H '콘텐츠 유형: 애플리케이션/json' -d '{"name": "adam", "password": "letmein"}' :4985/스마트홈/_user/ |
참고: JSON 객체의 이름 필드에는 공백이 없어야 합니다.
이렇게 하면 201 생성됨
상태 코드를 입력합니다. 이제 표준 포트에서 이 사용자로 로그인합니다:
1 2 3 |
$ curl -vX POST -H '콘텐츠 유형: 애플리케이션/json' -d '{"name": "adam", "password": "letmein"}' :4984/스마트홈/세션 |
응답에는 설정-쿠키
헤더와 본문에 사용자 세부 정보를 입력합니다.
모든 카우치베이스 모바일 SDK에는 인증을 위해 사용자 이름과 비밀번호를 지정하는 방법이 있으므로 두 번째 로그인 요청에 대해 걱정할 필요가 없습니다.
앱 서버
이 섹션에서는 /_user
관리자 REST API 엔드포인트를 공개하여 사용자가 앱을 통해 가입할 수 있도록 합니다.
인기 있는 Express 모듈을 사용하여 사용자 생성 요청을 처리하고 요청 모듈을 사용하여 다른 모든 트래픽을 동기화 게이트웨이로 프록시합니다.
다음 Node.js 모듈을 설치합니다:
1 |
npm 설치 express body-파서 요청 http-프록시 --저장 |
새 파일 열기 server.js
를 클릭하고 다음을 추가합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
var express = require('express') , bodyParser = require('body-parser') , 요청 = require('요청').기본값({json: true}) , httpProxy = require('http-proxy'); // 1 var 앱 = express(); 앱.사용('/signup', bodyParser.json()); // 2 앱.post('/signup', 함수 (req, res) { 콘솔.로그('가입 시간'); var json = req.body; var 옵션 = { URL: 'http://0.0.0.0:4985/smarthome/_user/', 메서드: 'POST', body: json }; 요청(옵션, 함수(오류, 응답) { res.writeHead(응답.statusCode); res.끝(); }); }); // 3 앱.모두('*', 함수(req, res) { var URL = 'http://0.0.0.0:4984' + req.URL; req.파이프(요청(URL)).파이프(res); }); // 4 var 서버 = 앱.듣기(8000, 함수 () { var 호스트 = 서버.주소().주소; var 포트 = 서버.주소().포트; 콘솔.로그('http://%s:%s'에서 앱 듣기, 호스트, 포트); }); |
단계별 진행 상황은 다음과 같습니다:
- Express의 새 인스턴스를 즉시 실행하고
bodyParser
경로가 일치하는 경우에만 미들웨어가입
. 실제로 동기화 게이트웨이에 프록시된 다른 모든 요청의 경우 원시 요청 본문이 필요합니다. - 처리
/signup
요청 모듈을 사용하여 관리자 포트에 사용자를 생성합니다. - 다른 모든 요청을 동기화 게이트웨이로 프록시합니다.
- 포트 8000에서 Node.js 웹 서버를 시작합니다.
이제부터 아래 URL을 사용하여 앱을 통해 사용자를 생성하고 푸시/풀 복제를 시작합니다:
http://localhost:8000
다른 사용자를 만들어 모든 것이 예상대로 작동하는지 테스트합니다:
1 2 3 |
$ curl -vX POST -H '콘텐츠 유형: 애플리케이션/json' -d '{"name": "앤디", "비밀번호": "letmein"}' :8000/가입/ |
그리고 이 사용자로 로그인합니다:
1 2 3 |
$ curl -vX POST -H '콘텐츠 유형: 애플리케이션/json' -d '{"name": "앤디", "비밀번호": "letmein"}' :8000/스마트홈/세션 |
다음 섹션에서는 이러한 엔드포인트를 테스트하기 위해 로그인 및 가입 화면이 있는 간단한 Android 앱을 만들 것입니다.
안드로이드 앱
Android 스튜디오를 열고 새 안드로이드 스튜디오 프로젝트 시작 에서 빠른 시작 메뉴로 이동합니다.
앱 이름 지정 스마트홈를 클릭하고 적절한 회사 도메인과 프로젝트 위치를 설정한 다음 다음:
대상 Android 장치 대화 상자에서 다음을 확인합니다. 휴대폰 및 태블릿를 클릭하고 최소 SDK를 API 22: Android 5.1(롤리팝) 를 클릭하고 다음:
이후 모바일에 활동 추가 대화 상자에서 추가 빈 활동 를 클릭하고 활동 이름을 지정합니다. 환영 활동:
가입 및 로그인 기능을 구축하려면 두 가지 종속성을 사용하게 됩니다:
- 안드로이드 디자인 지원 라이브러리를 사용하여 머티리얼 디자인 사양을 따르는 입력 텍스트 컴포넌트를 만들 수 있습니다.
- OkHttp를 사용하여 다음 주소로 POST 요청을 처리합니다.
/signup
그리고/스마트홈/_session
.
In build.gradle
를 클릭하고 해당 종속성을 추가합니다:
1 2 |
컴파일 'com.android.support:design:22.2.1' 컴파일 'com.squareup.okhttp:okhttp:2.3.0' |
In activity_welcome.xml
를 클릭하고 다음을 추가합니다. 리니어 레이아웃 기존 상대 레이아웃:
1 2 3 4 |
<버튼 스타일="?android: attr/borderlessButtonStyle;"> </버튼><버튼 스타일="?android: attr/borderlessButtonStyle;"> </버튼> |
두 버튼 모두 onClick
속성을 추가합니다. 메서드 중 하나에 마우스 커서를 이동하고 Alt + Enter
> 오픈 로그인 활동(보기) 만들기
에서 해당 메서드를 생성하는 바로 가기 환영 활동
:
에도 동일한 작업을 수행합니다. 가입하기 버튼을 클릭합니다.
다음으로, 두 개의 새 클래스와 XML 레이아웃을 생성합니다. 빈 활동 템플릿을 사용합니다. 하나는 로그인
및 다른 가입하기
:
다시 openLoginActivity
그리고 오픈사인업활동
메서드에 다음과 같은 명시적 인텐트를 추가합니다:
1 2 3 4 5 6 7 8 9 |
public void openLoginActivity(보기 보기) { 의도 의도 = new 의도(이, 로그인.클래스); 시작 활동(의도); } public void 오픈사인업활동(보기 보기) { 의도 의도 = new 의도(이, 가입하기.클래스); 시작 활동(의도); } |
의 부모 클래스를 변경합니다. Login.java
그리고 SignUp.java
에서 앱 호환 활동
에 활동
.
In res/values/styles.xml(v21)
를 클릭하고 상위 테마를 Theme.AppCompat.Light.DarkActionBar
.
열기 activity_sign_up.xml
를 열고 그 안에 다음을 추가합니다. 상대 레이아웃 태그:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<버튼 스타일="?android: attr/borderlessButtonStyle;"> </버튼> |
이제 앱을 실행하고 가입하기 버튼을 누르면 머티리얼 디자인 편집 텍스트 요소가 표시됩니다.
라는 새 자바 클래스를 만듭니다. 네트워크 도우미
를 다음과 같이 설정합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public 정적 final 미디어 유형 JSON = 미디어 유형.parse("application/json; charset=utf-8"); OkHttpClient 클라이언트 = new OkHttpClient(); 통화 post(문자열 URL, 문자열 json, 콜백 콜백) { RequestBody body = RequestBody.create(JSON, json); 요청 요청 = new 요청.빌더() .URL(URL) .post(body) .빌드(); 통화 통화 = 클라이언트.newCall(요청); 통화.대기열(콜백); 반환 통화; } |
안드로이드 앱에서 HTTP 요청을 하려면 먼저 안드로이드 앱에 네트워크 권한 AndroidManifest.xml
:
1 |
이제 다시 SignUp.java
를 클릭하고 다음 속성을 추가합니다:
1 2 3 4 5 |
네트워크 도우미 네트워크 도우미 = new 네트워크 도우미(); 텍스트 편집 이름 입력; 텍스트 편집 비밀번호 입력; 텍스트 편집 확인 비밀번호 입력; |
설정 텍스트 편집 구성 요소의 onCreate
메서드를 사용합니다:
1 2 3 |
이름 입력 = (텍스트 편집) findViewById(R.id.이름 입력); 비밀번호 입력 = (텍스트 편집) findViewById(R.id.비밀번호 입력); 확인 비밀번호 입력 = (텍스트 편집) findViewById(R.id.확인 비밀번호 입력); |
구현 가입
메서드를 사용하여 POST 요청을 보낼 수 있습니다. 8000/가입
이름에 비밀번호를 입력합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public void 가입(보기 보기) { 만약 (!비밀번호 입력.getText().toString().같음(확인 비밀번호 입력.getText().toString())) { 토스트.makeText(애플리케이션 컨텍스트 가져오기(), "비밀번호가 일치하지 않습니다", 토스트.LENGTH_LONG).show(); } else { 문자열 json = "{"이름": "" + nameInput.getText() + "", "비밀번호":"" + passwordInput.getText() + ""}"; 네트워크 도우미.post("http://10.0.3.2:8000/signup", json, new 콜백() { @오버라이드 public void onFailure(요청 요청, IOException e) { } @오버라이드 public void onResponse(응답 응답) 던지기 IOException { 문자열 responseStr = 응답.body().문자열(); final 문자열 메시지 텍스트 = "상태 코드 : " + 응답.코드() + "n" + "응답 본문 : " + responseStr; 런온유아이스레드(new 실행 가능() { @오버라이드 public void 실행() { 토스트.makeText(애플리케이션 컨텍스트 가져오기(), 메시지 텍스트, 토스트.LENGTH_LONG).show(); } }); } }); } } |
앱을 실행하고 이름과 비밀번호를 입력합니다. 사용자 계정이 성공적으로 생성되었다면 201 생성됨
상태 코드를 입력하면 관리자 대시보드에서 새로 생성된 사용자를 볼 수 있습니다:
마지막으로 로그인 화면으로 마무리하겠습니다. In activity_login.xml
에 다음을 추가합니다. 상대 레이아웃:
1 2 3 4 5 6 7 8 9 10 |
<버튼 스타일="?android: attr/borderlessButtonStyle;"> </버튼> |
다음에 속성을 추가합니다. Login.java
:
1 2 3 4 |
네트워크 도우미 네트워크 도우미 = new 네트워크 도우미(); 텍스트 편집 이름 입력; 텍스트 편집 비밀번호 입력; |
그리고 다음에서 동일한 뷰 바인딩 작업을 수행합니다. onCreate
:
1 2 |
이름 입력 = (텍스트 편집) findViewById(R.id.이름 입력); 비밀번호 입력 = (텍스트 편집) findViewById(R.id.비밀번호 입력); |
구현 로그인
메서드를 사용합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public void 로그인(보기 보기) { 문자열 json = "{"이름": "" + nameInput.getText() + "", "비밀번호":"" + passwordInput.getText() + ""}"; 네트워크 도우미.post("http://10.0.3.2:8000/smarthome/_session", json, new 콜백() { @오버라이드 public void onFailure(요청 요청, IOException e) { } @오버라이드 public void onResponse(응답 응답) 던지기 IOException { 문자열 responseStr = 응답.body().문자열(); final 문자열 메시지 텍스트 = "상태 코드 : " + 응답.코드() + "n" + "응답 본문 : " + responseStr; 런온유아이스레드(new 실행 가능() { @오버라이드 public void 실행() { 토스트.makeText(애플리케이션 컨텍스트 가져오기(), 메시지 텍스트, 토스트.LENGTH_LONG).show(); } }); } }); } |
앱을 실행하고 이전에 선택한 사용자 아이디와 비밀번호로 로그인합니다. 인증에 성공하면 200 OK 상태 코드가 반환됩니다:
참고: 모든 카우치베이스 라이트 SDK의 메서드에는 복제
객체가 이름과 비밀번호를 받아 대신 인증을 수행하므로 다음 주소로 POST 요청을 할 필요가 없을 것입니다. /스마트홈/_session
.
결론
이 튜토리얼에서는 관리자 REST API를 사용하여 Android 앱의 가입 화면을 통해 사용자를 만드는 방법을 배웠습니다.
놀라운 게시물입니다! 질문이 있습니다. Couchbase Sync Gateway를 활성 디렉토리 등과 같은 다른 리포지토리에 연결하려면 어떻게해야합니까? 또는 Sync Gateway와 Couchbase Server간에 Single Sign On을 얻을 수있는 방법이 있습니까?